[英]Structures in C as function return value
我想在普通C語言中使用strucs在微控制器上管理數據。 我閱讀了很多在線教程,但是找不到解決我問題的方法。 µC總是會遇到HardFault 。
這是頭文件中的結構定義:
typedef struct{
uint8_t laenge;
uint8_t rfu;
uint16_t nsi;
uint8_t epc_data[24];
uint16_t crc16;
}epc_memory;
這是函數原型:
epc_memory decodeACK(uint32_t rxBuffer[]);
功能 :
epc_memory decodeACK(uint32_t rxBuffer[])
{
counter=0;
epc_memory mem;
//Anfang finden
while(rxBuffer[counter] > ERROR_) counter++;
makeString(rxBuffer,counter);
startEnding();
counter = decoder();
if(counter > 100){
for (counter=0; counter<4; counter++)
{
mem.laenge = (mem.laenge << 1) | decoded[counter];
}
for (counter=4;counter<6; counter++)
{
mem.rfu = (mem.rfu << 1) | decoded[counter];
}
for (counter=6;counter<15; counter++)
{
mem.nsi = (mem.nsi << 1) | decoded[counter];
}
for(counter=15;counter<(15+mem.laenge);counter++)
{
mem.epc_data[(counter-15)/4] = (mem.epc_data[(counter-15/4)] << 1) | decoded[counter];
}
for(counter=(15+mem.laenge);counter<(31+mem.laenge);counter++)
{
mem.crc16 = (mem.crc16 << 1) | decoded[counter];
}
}
return mem;
}
這就是它在主體中的調用方式:
epc_memory tmp = decodeACK(&rxBuffer);
您能發現任何錯誤嗎?
謝謝
編輯:僅供參考...此功能工作正常:
uint16_t decodeRN16(uint32_t rxBuffer[])
{
counter=0;
uint16_t rn16 = 0;
//Anfang finden
while(rxBuffer[counter] > ERROR_) counter++;
makeString(rxBuffer,counter);
startEnding();
counter = decoder();
if(counter > 16){
for (counter=0; counter<16; counter++)
{
rn16 = (rn16 << 1) | decoded[counter];
}
}
return rn16;
}
所示代碼在讀取成員值之前未初始化mem
。 這很可能會導致不確定的行為。 那么一個結果可能是“硬故障”。
要修復此替換
epc_memory mem;
通過
epc_memory mem = {0};
后一個語句將所有mem
的成員初始化為0
。
當讓·弗朗索瓦·法布爾刪除他的答案時,我還想指出
epc_memory decodeACK(uint32_t rxBuffer[])
如果叫
decodeACK(&rxBuffer);
被錯誤地稱為。
假設數組的定義是
uint32_t rxBuffer[1024];
調用函數
decodeACK(rxBuffer);
背景
epc_memory decodeACK(uint32_t rxBuffer[])
是相同的
epc_memory decodeACK(uint32_t * rxBuffer)
並將數組傳遞給函數會使它衰減到其第一個元素的地址。 這里是uint32_t*
。
傳遞&rxBuffer
會評估為將指針傳遞給1024 uint32_t
數組,該數組將是uint32_t(3)[1024]
,這顯然不是decodeACK()
期望的。
它有時似乎仍然起作用的原因是,實際上數組的地址與其第一個元素的地址相同。
仍然在此處傳遞數組的地址正在傳遞錯誤的類型,正在調用臭名昭著的Undefined Behaviour,是不可靠的代碼,是錯誤的代碼,編譯器顯然應該通過發出相關警告來向您指出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.