在C中为未知(大小)结构创建缓冲区
我正在为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()复制长度字节从缓冲区开始到存储事物的任何位置(以及记录存储在副本地址的长度)以供将来处理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |