簡體   English   中英

輸入要緩存在C中的數據

[英]Typed data to buffer in C

我有這個簽名的功能:

void my_func(uint8_t param1, uint8_t param2, uint8_t* array, uint8_t array_length)

給定的參數必須放在這樣的緩沖區中:

uint8_t buff = {param1, param2, array[0], ..., array[length - 1], array_length};

並作為參數傳遞給采用緩沖區及其長度的不可修改函數。

void consume(uint8_t* buff, uint8_t length)

在my_func中,我可以創建一個size的緩沖區:

sizeof(param1) + sizeof(param2) + array_length

但它會為現有陣列使用額外的內存。

作為一種非便攜式解決方案,我希望使用壓縮結構並定義my_func,如下所示:

typedef struct __attribute__((packed))
{
  uint8_t param1; 
  uint8_t param2;
  uint8_t array[MAX_ARRAY_SIZE];
  uint8_t array_length;
}TsMyStruct;

void my_func(TsMyStruct*);

通過這種解決方案,我可以直接將TsMyStruct *強制轉換為uint8_t *,並將其賦予consume()函數:

consume(uint8_t* (mystruct), sizeof(TsMyStruct))

該解決方案的一個缺點是,對於大小小於MAX_ARRAY_SIZE的數組,此解決方案並不比第一個命題好。

您還有其他建議(不使用malloc)嗎?

當您可以交換arrayarray_length (我看不到,使用動態array_length順序如何有意義)時,可以編寫

struct foo {
  uint8_t param1;
  uint8_t param2;
  uint8_t array_length;
  uint8_t array[]
};

並像上面一樣分配+填充

struct foo *buf = malloc(sizeof *buf + array_length);

buf->param1 = param1;
buf->param2 = param2;
buf->array_length = array_length;
memcpy(buf->array, array, array_length);

您可以創建大小為4的指針數組,其中第一個元素是指向param1的指針,第二個元素是指向param2的指針,第三個元素是指向數組的指針,第四個元素是指向數組的指針數組的大小。

uint8_t* arrayOfPointers[4]={&param1,&param2,&array,&array_length};
uint8_t* buff = arrayOfPointers;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM