2

我是编码新手,在复制结构元素的浮点值和传入int transmit_buffer[12]. 请帮忙。

#include <stdio.h>
#include <string.h>
int i;

main(){

   int transmit_buffer[12];
   struct TX_REPORT{
       int variable1;
       float variable2;
       int variable3;
       int variable4;
       int variable5;
       int variable6;  
   };

   struct TX_REPORT transmit_report = {1, 1.5, 40, 1, 45, 7};
   memcpy(transmit_buffer, &transmit_report, sizeof transmit_buffer);
   for(i=0;i<6;i++){
       printf("%d\n",transmit_buffer[i]);
   }
}
4

4 回答 4

2

您的代码不是标准 C,并且表现出一些未定义的行为

不能保证sizeof(float) == sizeof(int)。无法保证浮点数具有IEEE 754表示。

但是,在 x86/Linux 上,这两个假设都是正确的。

顺便说一句,如果您想将这样的结构发送到文件或通过网络,请考虑一些序列化技术。我建议使用JSON等文本序列化格式

于 2013-09-07T10:35:03.443 回答
1

您必须询问是否复制结构成员而不是结构。因为您编写的内容对于不同的类型变量是不可能的,所以可以使用 memcpy();

char *buf = malloc(sizeof(info.a) + sizeof(info.b) + sizeof(info.c));
// Get a pointer to the beginning of the buffer
char *p = buf;
// Copy sizeof(info.a) bytes of stuff from info.a to p
memcpy(p, info.a, sizeof(info.a));
// Advance p to point immediately after the copy of info.a
p += sizeof(info.a);
// And so on...
memcpy(p, info.b, sizeof(info.b));
p += sizeof(info.b);
memcpy(p, info.c, sizeof(info.c));
于 2013-09-07T10:36:01.073 回答
0

你最好的选择可能是工会——

typedef struct {
       int variable1;
       float variable2;
       int variable3;
       int variable4;
       int variable5;
       int variable6;  
   } t_AsStruct;

typedef union {
    t_AsStruct as_struct;
    int as_ints[sizeof(t_AsStruct)/sizeof(int) + 1];  /* N.B. a float can be various sizes so since we can't have 0.5 ints in an array add one */
    } t_tx_report;

请注意,如果您可以控制结构,通常最好不要在结构中间混合不同大小的类型,因为这可能导致由于填充而导致更大的内存使用或由于内存对齐问题而导致性能下降。

于 2013-09-07T11:01:16.443 回答
0

您的代码看起来或多或少还可以,并且您没有说出您面临的实际问题,但是我猜您对 float 元素显示为 int 值的事实并不满意,该值显然与它的原始值。这实际上只是一个外观问题(因为您在 printf 关于此元素的类型撒谎),但如果您想查看更有意义的缓冲区版本,那么您可以像这样更改代码:

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

int main(){
   int i;
   int transmit_buffer[12];
   struct TX_REPORT{
       int variable1;
       float variable2;
       int variable3;
       int variable4;
       int variable5;
       int variable6;  
   };

   struct TX_REPORT transmit_report = {1, 1.5, 40, 1, 45, 7};
   memcpy(transmit_buffer, &transmit_report, sizeof transmit_buffer);
   for(i=0;i<6;i++){
       if (i == 1)  // handle float element as special case
           printf("%g\n",transmit_buffer[i]);
       else         // other elements are ints
           printf("%d\n",transmit_buffer[i]);
   }
}
于 2013-09-07T10:52:26.147 回答