Первый раз столкнулся с такой проблемой:
По непонятной причине компилятор вместо констант float и double генерирует их значение без дробной части, например:
Есть функция с прототипом:
int Do(int, int, float);
В коде вызывается так:
int nRes = Do(1, 15, .8f);
Результат: в функцию в третьем параметре передается 0. Если в дебаге зайти в Do, дебаггер это показывает. Ассемблерный код вызова генерируется такой:
mov esi, esp
push 0
push 0Fh
push 01h
call Do
mov nRes, eax
Что самое смешное, если что-нибудь отредактировать не меняя смысла, например, стереть точку в .8f, а потом ее опять поставить, то генерируется код, который и должен генерироваться! Но и это не всегда срабатывает. При этом ребилд не помогает.
Такая же ерунда, например, если есть такой код:
double d1, d2;
d1 = d2 = 0.5;
в результате и d1, и d2 равны .0.
Какие у кого есть соображения? Может ли это быть ошибкой компилятора?