Мне очень нравится WxWidgets, и я начал с программирования на C++. Моя программа-образец конвертирует Цельсий в Фаренгейт из текстовой формы. Вот мой основной код:WxWidgets: Простая математическая формула передает неправильные результаты?
//get "100" from textbox
wxString szCelsius = TextCtrl1->GetValue();
long lCelsius;
//attempt to cast into long
szCelsius.ToLong(&lCelsius, 10);
//formula that works in normal cases to get fahrenheit
long lFahrenheit = ((9.f/5.f) * lCelsius + 32);
//SOMEHOW this works:
//long lFahrenheit = ((9.f/5.f) * 100 + 32);
//display debug info, note it displays lCelsius as 100
wxString debuginfo;
debuginfo << _T("deg C: ") << lCelsius << _T("\n");
//displays incorrectly as 211
debuginfo << _T("deg F: ") << lFahrenheit << _T("\n");
//this displays 100
std::cout << lCelsius;
//this fails though
assert(lCelsius == 100);
Теперь с отладочной, lCelcius 100, как ожидается, но она возвращает Фаренгейта в 211 вместо 212! Странно, что эта формула отлично работает в чистом C, и когда я заменяю lCelsius
на 100
, она отлично работает, хотя моя информация об отладке четко говорит о том, что она равна 100.
Вы видите какую-либо очевидную проблему, или я просто не знаю способный сделать такую простую вещь? Я не уверен, что делает Wx, чтобы сделать его меньше, чем нужно.
EDIT: в том числе assert.h и работает lCelsius == 100 терпит неудачу в отладчике, но станд :: соиЬ lCelsius возвращает 100. Там должно быть что-то с Wx, что коверкая результат, но по-прежнему является «100». .
Есть ли 'szCelsius.ToLong (& lCelsius, 10);' return 'true'? –
@Vijay, я запустил assert, и он прошел, так что это 'true' – John
Какой компилятор вы используете? wxWidgets использует strtol внутри, и это зависит от компилятора. –