加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中为未知(大小)结构创建缓冲区

发布时间:2020-12-16 10:02:38 所属栏目:百科 来源:网络整理
导读:我正在为RF24Mesh微控制器层编写一个抽象层来实现消息签名. 因为我希望尽可能地使它成为通用的,所以我希望能够为ex传递任何struct / payload :(这只是一个应该能够传递给函数的结构的示例) struct payload_sensor { uint8_t some_other_sensor_data[32]; int
我正在为RF24Mesh微控制器层编写一个抽象层来实现消息签名.

因为我希望尽可能地使它成为通用的,所以我希望能够为ex传递任何struct / payload :(这只是一个应该能够传递给函数的结构的示例)

struct payload_sensor {
        uint8_t some_other_sensor_data[32];
        int sensor_id;
        int sensor_data;
  };

到签名函数,然后让它处理存储有效负载/结构,直到完成所有其他操作发送它.

但是事实上,我无法预测传递给函数的结构的确切大小(它应该处理传递给它的任何结构),相同的结构可能会被重用(填充其他数据)并再次传递给函数.我完全无法想到一个好的解决方案.

现在,我如何实现一个适当的缓冲区来存储这些未知的有效负载/结构,直到它们准备好发送?我还必须记住,代码是在AVR上运行的,因此AVR内存(碎片)可能会成为一个问题.

我对结构和更高级的东西都是新手,所以不要介意我错过了一些明显的东西.

解决方法

通常通过定义结构来解决这类问题,例如:

struct payload_sensor {
    unsigned int struct_size;
    int sensor_id;
    type any_other_always_present_data;
    char variable_data[];
};

其中variable_data是有效负载的未知部分.

当您知道实际的variable_data需要多大时,您可以执行以下操作:

unsigned int actual_length = length_of_variable_data + sizeof(struct payload_sensor);
struct payload_sensor *myStruct = malloc(actual_length);
myStruct->struct_size = actual_length;

并将您的可变数据复制到结构:

memcpy(&myStruct->variable_data,&data_source,length_of_variable_data);

根据评论和编辑,听起来你的意图是能够将数据传递给某些必须保留数据副本的函数,直到稍后的某个时间点,并且该函数不知道它被要求的内容.保持.如果是这种情况,您需要做的就是告诉函数每次调用的长度.例如,void myFunction(const void * buffer,unsigned int length);:

myFunction(&myStructOfType1,sizeof(myStructOfType1));
myFunction(&myStructOfType2,sizeof(myStructOfType2));

并且,基于您对重用结构的关注,将myFunction()复制长度字节从缓冲区开始到存储事物的任何位置(以及记录存储在副本地址的长度)以供将来处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读