реклама на сайте
подробности

 
 
> глюк в IAR ARM C++ 4.41A
sergik_vrn
сообщение Jan 26 2007, 11:08
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



вчера обнаружился не очень приятный глюк в компиляторе при передаче параметром записи типа
{ 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sergik_vrn   глюк в IAR ARM C++ 4.41A   Jan 26 2007, 11:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01346 секунд с 7
ELECTRONIX ©2004-2016