2011-09-15 47 views
0

我有一個結構,我想要做的是使用for循環爲其成員賦值。這樣我就不必使用成員名稱。因爲結構很長,我不想要20行p_struct->member_name等等。我到目前爲止已經在下面,但是我不確定我是否會朝着正確的方向前進。
在頭文件:將值賦給struct成員而不使用c中的成員名稱?

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 
} 
+0

如果我使用#pragma pack會有幫助嗎? – infinitloop

+0

比p_struct-> member_name的20行更糟糕的是任何解密你的代碼正在做的事情的解決方案。如果初始化困擾你,將它包裝在一個函數中。 –

回答

1

這是無效的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 as *(int *)((char *)foo + mystruct_def[0].offset)

這只是一個例子;現實世界中的使用可能會更詳細一點...

1

你不是,P_DATA是一個指向數據,P_DATA ++會移動它的sizeof(數據)字節了,這不會是下一個成員,但不在你的結構中。此外,由於成員類型不同,因此即使問題得到修復,該方法也不起作用。

1

如果它只是你正在試圖解決一個問題的可讀性,那麼你應該考慮使用一個struct初始化:

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

這是標準的C99,所以它現在幾乎可以在任何地方工作(MSVC除外)。 –

相關問題