2013-10-26 64 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; 
}