簡體   English   中英

C中的結構作為函數返回值

[英]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.

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