考慮以下代碼:功能sscanf的必須分配給變量,否則奇怪的行爲
#define TRANSLATOR_requestElectricityMeterWrite() do{addr = word_getAddress(); value = word_getValue(); }while(0)
uint16_t value;
uint8_t addr;
bool dispatcher(void)
{
TRANSLATOR_requestElectricityMeterWrite();
return true;
} // AFTER this point (during debug) program goes to default handler
int main(void)
{
if(dispatcher())
continue;
. . . .
. . . .
}
uint16_t word_getValue(void)
{
uint16_t value;
sscanf("ABCD", "%4x", (unsigned int *)&value);
return value;
}
uint8_t word_getAddress(void)
{
uint8_t address;
sscanf("00", "%2x", (unsigned int *)&address);
;
return address;
}
當上面的代碼運行時,內部if
原因程序語句崩潰(去一些默認的處理程序)。
但是,當我改變兩個(word_getValue
和word_ getAddres
)功能,以這樣的:
uint16_t word_getValue(void)
{
uint16_t value;
int i = 0;i++;
i = sscanf(WORD_getValueString(), "%4x", (unsigned int *)(&value));
return value;
}
uint8_t word_getAddress(void)
{
uint8_t address;
int i = 0;i++;
i = sscanf(WORD_getNameString(), "%2x", (unsigned int *)(&address));
return address;
}
它的工作原理。此外如果虛擬i
似乎解決了這個問題。但爲什麼它不以另一種方式工作呢?
GNU ARM工具鏈v4.8.3
'WORD_getValueString()'和'WORD_getNameString()'定義在哪裏?看起來您正在向我們展示您的代碼的不同版本。 –
在另一個文件中。但是他們的聲明也包括在內。構建報告既沒有警告也沒有錯誤報告。 – Hairi
我建議發佈[最小,完整和可驗證代碼](http://stackoverflow.com/help/mcve) –