как создать вложенную структуру в c - PullRequest
0 голосов
/ 19 ноября 2018

Я начал изучать C и обнаружил, что создание сложных структур данных может быть довольно сложным!

Вот фон:

Я создал struct в заголовочном файле foo.h и сделал его содержимое общедоступным:

struct frame {
     char *name;
     int width;
     int height;
     //other stuffs
}

extern const struct frame
     vid_1080p,
     vid_720p;

Экземпляры frame являются постоянными и могут быть доступны из других мух. foo.c выглядит так:

const struct frame vid_1080p = {
    .name                 = "1080p",
    .width                = 1920,
    .height               = 1080,
};
const struct frame vid_720p = {
    .name                 = "720p",
    .width                = 1280,
    .height               = 720,
};

Я хочу создать еще один struct в пределах struct frame, элементы которого будут рассчитаны при запуске моей программы, и можно будет изменить это при необходимости. Я не уверен, как подойти к этому, я попробовал этот подход ниже, и он не работает.

Мой неудачный подход:

Я изменил foo.h как таковой:

struct frame_calc {
     int ratio;
     //other stuffs
}

struct frame {
     char *name;
     int width;
     int height;
     //other stuffs
     struct frame_calc *calc;
}

И foo.c также модифицируется:

 const struct frame vid_1080p = {
        .name                 = "1080p",
        .width                = 1920,
        .height               = 1080,
        .calc                 =  malloc(sizeof(struct frame_calc)) //compiler complains here
    };
    const struct frame 720p = {
        .name                 = "720p",
        .width                = 1280,
        .height               = 720,
        .calc                 =  malloc(sizeof(struct frame_calc))
    };

И затем init() вызывается один раз в начале моей программы, и это заполняет структуру calc:

void init(void)
{
     vid_1080p.calc.ratio = vid_1080p.height / vid_1080p.width;
     vid_720p.calc.ratio  = vid_720p.height  / vid_720p.width;
}

Этот подход дает мне несколько ошибок компилятора. Я также не уверен, как правильно инициализировать мою вложенную структуру. Еще одна проблема, я использую malloc, это означает, что мне нужно будет освободить это в нужных местах. Я хотел бы избежать этого. Я уверен, что все профессиональные программисты знают, как справиться с этим лучше!

Последний вопрос, как мне получить доступ к этому элементу ratio для экземпляра vid_1080p из других файлов c? Я думаю vid_1080p->frame->calc->ratio.

Надеюсь, мне удалось объяснить, что я хочу сделать? Если нет, я был бы признателен за конструктивную критику в отношении того, как лучше изменить этот вопрос в StackOverflow, учитывая, что это мой первый вопрос!

1 Ответ

0 голосов
/ 19 ноября 2018

Вам не нужно malloc член calc, потому что встроенный фактический экземпляр - это не указатель.

Если по какой-то причине вам нужен указатель, тогда вам нужно:

struct frame {
     ...
     struct frame_calc* calc;
}

И доступ будет var.calc->ratio = something;

Если вы пытаетесь изменить структуру после создания (через init()), почему структуры const?Вы пытались обойти проблему const struct, заставив структуру содержать указатель, чтобы вам не пришлось менять указатель, но можно было бы изменить значение, на которое он указывает?

Я бы посоветовал не использовать conststructs:

struct frame vid_1080p {
    ...
}

Ваша функция init может выполнить vid_1080p.calc.ratio = vid_1080p.height / vid_1080p.width; Если вы действительно хотите принудительно использовать константный доступ к структурам через указатель на структуру const.const frame *p_1080p.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...