Я начал изучать 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, учитывая, что это мой первый вопрос!