このコード考えてみましょう:機能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
原因プログラム内の文がクラッシュする(いくつかのデフォルトハンドラに行くを)。
しかし、ときに私はこれまで2(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) –