Присваивание значений члену структуры без использования имени члена в c? - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть структура, и я хотел бы назначить значения ее членам с помощью цикла for. Таким образом, мне не нужно использовать имя участника. Потому что структура длинная, и я не хочу 20 строк p_struct->member_name и т. Д. То, что у меня есть, ниже, но я не уверен, что я иду в правильном направлении.
В заголовочном файле:

typedef struct {
 int x;
 char ch;
  ...
  ...
}data;
data g_data;

в .c файле ...

data *p_data;
p_data = &(g_data.x)
for(i=0 till struct_elements) {
    *p_data = (some value);
    p_data++; //next member
}

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

Это недопустимый C. Но то, что было бы допустимым, - это создать постоянную таблицу типов и смещений каждого члена и использовать ее в вашем цикле:

struct struct_def {
    int typecode;
    size_t offset;
};

static const struct struct_def mystruct_def[] = {
    { TYPE_INT, offsetof(struct mystruct, x) },
    { TYPE_CHAR, offsetof(struct mystruct, y) },
    /* ... */
    { TYPE_NONE, 0 }
};

Тогда вы можете получить доступ к члену x как *(int *)((char *)foo + mystruct_def[0].offset).

Это всего лишь пример; использование в реальном мире, вероятно, было бы немного сложнее ...

1 голос
/ 15 сентября 2011

Если вы пытаетесь решить только проблему читабельности, вам следует подумать об использовании инициализатора структуры:

typedef struct { int a,b,c,d,e } data; 

data g_data[10];
int i;
for (i=0;i<10;i++) 
{
 data t={i,i*2,i*3,i*4,i*5 }; /* non-constant initializers are supported with C99, C++, GNU-C or MSVC..*/
 g_data[i]=t; /* the optimizer will turn this into direct stores.. */
}

Если вы используете gcc (или компилятор C99, спасибо Dietrich Epp за напоминание), то вы даже можете написать:

for (i=0;i<10;i++) 
{
 g_data[i]=(data){i,i*2,i*3,i*4,i*5 }; 
}
1 голос
/ 15 сентября 2011

Это не так, p_data - это указатель на данные, p_data ++ переместит его на размер байта (данных) вверх, что будет не следующим членом, но за пределами вашей структуры. Кроме того, поскольку члены имеют разные типы, метод не будет работать, даже если бы эта проблема была исправлена.

...