Итеративное присвоение значений структурам C - PullRequest
1 голос
/ 29 июля 2011

У меня есть структура, определенная как

typedef struct{
char string1
char string2
int number1
char string3
}structure1

и хотите присвоить значения строке1, строке2, номеру1, строке3 в цикле, подобном этому

structure1 bob
for(int i = 0,i<=4,i++)
{
bob.i = assigned value
}

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

Ответы [ 4 ]

2 голосов
/ 29 июля 2011

Это не возможно в C. Самое близкое к этому будет вычисление смещений полей и последующее использование их для присвоения значений:

int fieldOffset[4];

structure1 base;

fieldOffset[0] = (char*)&base.string1 - (char*)&base;
fieldOffset[1] = (char*)&base.string2 - (char*)&base;
fieldOffset[2] = (char*)&base.number1 - (char*)&base;
fieldOffset[3] = (char*)&base.string3 - (char*)&base;

structure1 structYouWantToAssign;

for (int i = 0; i < 4; ++i)
{
    *((char*)&structYouWantToAssign + fieldOffset[i]) = assignedValue;
}

Предупреждение : этот код только для демонстрации возможности назначения полей без их имени, но вы должны не использовать его!

0 голосов
/ 29 июля 2011

Используйте функцию, которая назначает члену: -

void BobAssign(struct* s, int i, void * value);
0 голосов
/ 29 июля 2011

Вы можете попробовать немного другой подход.Желание сделать это подразумевает, что вы инициализируете их, и в этом случае вы можете сделать это:

#define STRUCT_DEF {"default", "another", 1234, "the last string" }
...
structure1 Variable = {"default", "another", 1234, "the last string"};

(предполагается, что вы имели в виду char string1 [STR_LEN], а не просто один символ).

В качестве альтернативы вы можете попробовать переопределить вашу структуру с массивами внутри:

typedef struct{
char string[NUM_STRINGS][STR_LENGTH];
int number1;
}structure1

Таким образом, вы можете обращаться к строкам в цикле, не называя каждую по отдельности.

0 голосов
/ 29 июля 2011

К сожалению, это не возможно в C. Это очень круто, но в синтаксисе ничего такого нет.

...