2013-10-26 105 views
3

我有這樣的結構結構成員賦值用循環

struct hour_parameters{ 
    uint8_t VALUE_00; 
    uint8_t VALUE_01; 
    uint8_t VALUE_02; 
    uint8_t VALUE_03; 
    uint8_t VALUE_04; 
    uint8_t VALUE_05; 
    uint8_t VALUE_06; 
    uint8_t VALUE_07; 
    uint8_t VALUE_08; 
    uint8_t VALUE_09; 
    uint8_t VALUE_10; 
    uint8_t VALUE_11; 
    uint8_t VALUE_12; 
    uint8_t VALUE_13; 
    uint8_t VALUE_14; 
    uint8_t VALUE_15; 
    uint8_t VALUE_16; 
    uint8_t VALUE_17; 
    uint8_t VALUE_18; 
    uint8_t VALUE_19; 
    uint8_t VALUE_20; 
    uint8_t VALUE_21; 
    uint8_t VALUE_22; 
    uint8_t VALUE_23; 
}; 

struct hour_parameters hparam; 

我想分配uint8_t x[24]hparam,我怎麼能與一個for循環去做,這就是

hparam.value00 = x[0]; 
hparam.value01 = x[1]; 
and so on? 
+3

爲什麼不使用數組? – Kunal

+0

是的,對於上面的例子來說,使用數組似乎更好。但我只是想盡可能簡單地舉一個例子。有時候,使用struct會更方便,更易讀。我只是想知道如何在struct – sven

+1

中完成賦值我的意思是在你的結構中使用一個數組。 – Kunal

回答

4

你真的應該在你的結構中使用一個數組,但是... ...

#include <string.h> 
memcpy(&hparam, x, sizeof(hparam)); 

(我現在正躲在桌子下面)

這是很危險的原因之一是可能在結構中填充。現在, 因爲它們都是字節,所以你很安全。但是,在技術上,這種東西是不合法的。有一兩件事你可以事先做的是

assert(sizeof(hparam) == sizeof(x)); 

如果你堅持一個循環:

for(int i = 0; i != sizeof(hparam); i++) { 
    ((uint8_t *)&hparam)[i] = x[i]; 
} 

這是醜陋的,而不是太猶太無論是。 Kerrek的評論下面目前的理由不這樣做。

+0

填充不是太牽強。 C11內存模型要求所有結構成員都可以單獨修改而不發明對其他變量的寫入,因此沒有字節寬度內存訪問的體系結構可能需要使用填充(或者沒有'uint8_t')。 –

+0

爲什麼在第一個例子中投射指針? – 2013-10-26 22:10:50

+0

舊習慣難改。 –

1

這應該工作:

memcpy_s(&hparam, sizeof hparam, x, sizeof x) 

雖然這是不好的代碼。

請注意,你的結構相當於陣列,所以最好的解決辦法是:

uint8_t hparam[24] = {0}; 
memcpy_s(hparam, sizeof hparam, x, sizeof x); 
1

由於@Charlie伯恩斯指出,要儘量避免它 除非你知道的結構究竟如何填充/對齊。 它不是便攜式編碼風格。

你也可以做一個結構分配,如

hparams = *(struct hour_parameters *)x; 
1

查理伯恩斯說,你可以用這個結構作爲一個數組,爲了安全,迫使成員的最大對齊1如果你的編譯器支持pragma pack

#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 

#pragma pack(push,1) 
struct hour_parameters{ 
    uint8_t VALUE_00; 
    uint8_t VALUE_01; 
    uint8_t VALUE_02; 
    uint8_t VALUE_03; 
    ... 
}; 
#pragma pack(pop) 

int main(void) 
{ 
    struct hour_parameters hparam; 
    uint8_t x[24] = {0}; 

    memcpy(&hparam, x, 24); 
    printf("%u\n", hparam.VALUE_12); 
    return 0; 
}