Рассмотрим этот код:Функция 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) –