2013-11-28 25 views
2

我想知道下面的問題的解決方案。請幫忙。C中的結構成員的運行時初始化(成員名稱決定運行)

問題:

struct s{ 
int a; 
int b; 
}st; 

我想要的功能在運行時初始化值。問題是我想使它成爲泛型,所以我想將成員名稱作爲輸入傳遞給函數,並將其初始化。

fun_init(char* mem, int val) 
{ 
    // Find offset of the member variable in struct 'st' 
    // Assign the value 
} 

一個直接的解決方案是對成員名稱使用字符串比較。但是如果我碰巧在稍後添加一些額外的變量,我將不得不修改這個我不想要的功能。 希望我能夠清楚地闡述這些問題。

謝謝

+3

C名稱在運行時不存在。編譯後的代碼不需要它們。 – rici

+0

使用'union'可能... –

+0

如果您只需要一個或兩個結構,您可以使用代碼生成器來設置適當的數據結構或生成合適的代碼來訪問這些字段。當然,這存在與代碼生成器相關的常見問題。 – creichen

回答

1
void fun_init(int *storage, int val) { 
    *storage = val; 
} 
void something_else(void) { 
    struct s { 
     int a; 
     int b; 
    } st; 
    fun_init(&st.a, 42); 
} 

然而,如果你需要動態地確定鍵的名字,你做錯了什麼。如果你需要存儲鍵/值對,也許你會是interested in the hashtable

+0

感謝所有的評論。 – ssin

2

C沒有提供按名稱查找符號的方法。有關更多信息,請參閱this thread

這裏最簡單的解決方案是使用associative array

Read this thread如果您需要混合數值類型。 (在你的榜樣,所有的值類型是整型,所以你可能不需要這個。)

0

我猜你想要從用戶輸入或持久性初始化結構。

解決方案涉及創建@Domi提到的關聯數組。

該數組填充了諸如(const char *,unsigned)之類的鍵/值對。 關鍵是struct成員的名稱,值是從結構開始的偏移量。每個結構都需要一個函數來初始化上面的數組。您可以通過offsetof宏獲得成員的偏移量。

這將不是使用具有位字段(子字節命名成員)的結構。