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?
4

4 回答 4

4

你真的应该在你的结构中使用一个数组但是......

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

(我现在躲在桌子底下)

这是危险的原因之一是结构中可能存在填充。现在,因为它们都是字节,所以你很安全。但是,从技术上讲,这种东西是不合法的。您可以事先做的一件事是

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

如果您坚持使用 for 循环:

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

这是丑陋的,也不是太犹太。Kerrek 在下面的评论提出了不这样做的理由。

于 2013-10-26T22:02:09.570 回答
1

这应该有效:

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

虽然这不是好的代码。

请注意,您的结构等效于数组,因此更好的解决方案是:

uint8_t hparam[24] = {0};
memcpy_s( hparam, sizeof hparam, x, sizeof x );
于 2013-10-26T22:11:41.963 回答
1

正如@Charlie Burns 指出的那样,除非您确切知道结构是如何填充/对齐的,否则您想尝试避免它。它不是可移植的编码风格。

您还可以进行结构分配,例如

hparams = *(struct hour_parameters *)x;
于 2013-10-26T22:12:51.570 回答
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;
}
于 2013-10-26T22:16:23.163 回答