Получение информации (типы, значения ... и т. Д.) О членах структуры типа C - PullRequest
0 голосов
/ 20 июня 2019

Я хотел бы получить помощь по структуре в стиле Си. Я не очень разбираюсь в C, поэтому я не знаком с основами.

Прямо сейчас у меня есть структура (outerStruct), которая имеет другие структуры в качестве членов (innerStruct1, innerStruct2 ...). Что мне нужно сделать, это получить значения переменных-членов MEMBER OF innerStruct1, innerStruct2 ....

Единственная информация, которую я имею, - это указатель на outerStruct и структура данных, которая имеет все возможные типы переменных MEMBER VARIABLES OF EACH innerStructs. Обратите внимание, что все имена переменных являются просто типом переменной + "_val", поэтому, если я смогу типы переменных-членов, я смогу также получить имена переменных.

Мне нужно получить информацию о ЧЛЕНАХ innerStructs и разобрать их в текстовый файл, при этом появятся имя переменной s.t и значение переменной.

Могу ли я получить переменную-член innerStruct без использования имен переменных? Поскольку C играет с распределением памяти, может быть, это возможно? Если это невозможно, какую возможную информацию я могу получить?

Контейнер с именами и типами переменных довольно большой, поэтому, если я буду использовать все значения для извлечения информации, он выполнит слишком много пустых проверок, и время будет линейным по отношению к размеру контейнера. Вместо этого я хотел бы знать, смогу ли я воспользоваться соглашением об именах и сделать код более эффективным.

struct outerStruct {
   innerStruct1 innerStruct1_val;
   innerStruct2 innerStruct2_val;
}

struct innerStruct1 {
   int int_val = 5;
   char char_val = 'a';
}

struct innerStruct2 {
   float float_val = 4.0;
   double double_val = 5.0;
}

Ожидаемый вывод (печать на экран):

"innerStruct1_val : int_val = 5, char_val = 'a' || innerStruct2_val : float_val = 4.0, double_val = 5.0"

TL; DR Я хочу получить значения внутренней структуры из вложенной структуры без использования фактических имен переменных.

(Кроме того, здесь приведен код, показывающий только структуру структуры. Будет использоваться правильный синтаксис.)

1 Ответ

0 голосов
/ 20 июня 2019

В C вы должны вручную обходить членов соответствующих структур. Но даже если вы хотите сохранить внутреннюю структуру структуры "частной", просто сделав имя структурного тега общедоступным, вы можете предоставить открытую функцию для ее печати. ​​

struct outerStruct;

void print_outerStruct(const struct outerStruct *);

Аналогично для внутренних структур.

Поскольку вам необходимо определить всю внешнюю структуру где-нибудь, чтобы она была полезной, это место также будет местом для реализации ее функции печати. ​​

struct outerStruct {
   struct innerStruct1 innerStruct1_val;
   struct innerStruct2 innerStruct2_val;
};

void print_outerStruct (const struct outerStruct *os) {
    printf("outerStruct (%p) { ", os);
    printf("%s: ", "innerStruct1_val");
    print_innerStruct1(&os->innerStruct1_val);
    printf("%s: ", "innerStruct2_val");
    print_innerStruct2(&os->innerStruct2_val);
    printf(" }\n");
}

При наличии достаточного количества лесов вы можете генерировать эти функции печати механически. Например, это может потребовать написания парсера для ваших структур.

...