考虑以下代码:功能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) –