1

私には構造があり、私がやりたいのは、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
}
4

3 に答える 3

2

これは有効な C ではありません。ただし、有効な 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)

これは単なる例です。実際の使用法は、おそらくもう少し精巧になるでしょう...

于 2011-09-15T14:10:37.207 に答える
1

そうではありません.p_dataはデータへのポインタです.p_data ++はそれをsizeof(data)バイト上に移動します.これは次のメンバーではなく、構造体の外です. また、メンバーの種類が異なるため、その問題が修正されたとしても、この方法は機能しません。

于 2011-09-15T14:10:07.023 に答える
1

解決しようとしているのが読みやすさの問題だけである場合は、構造体初期化子の使用を検討する必要があります。

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 }; 
}
于 2011-09-15T14:22:38.833 に答える