Перейти к содержанию
    

глюк в IAR ARM C++ 4.41A

вчера обнаружился не очень приятный глюк в компиляторе при передаче параметром записи типа

{ 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...