вчера обнаружился не очень приятный глюк в компиляторе при передаче параметром записи типа
{ char, char }. проявляется следующим образом - запись целиком передается в одном регистре, потом старший байт выносится в другой регистр, а младший остается там же, причем значение старшего байта не сбрасывается. поэтому при вычислениях (в частности, я попал на взятие индекса массива) используется значение всего слова, а не младшего байта. вот исходник
Код
#include "stdio.h"
class CNumber
{
public:
CNumber(char h, char l): low_(l), hi_(h) {}
char low() const { return low_; }
char hi() const { return hi_; }
private:
char low_;
char hi_;
};
class usability
{
public:
usability(): use_(0) { }
void init(int num) { use_ = num; }
int out() const { return use_; }
private:
int use_;
};
usability use_test[1000];
int test(CNumber param)
{
return use_test[param.low()].out();
}
int main()
{
for (int i =0; i < 1000; ++i) use_test[i].init(i);
CNumber num(1,1);
int value = test(num);
printf("%d", value);
}
в результате имеем значение value 257, а не 1, как ожидали
на всякий случай прикрепляю весь проект (4кб)
Сообщение отредактировал sergik_vrn - Jan 26 2007, 11:24