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

 
 
> сообщение об ошибке в GCC
krik
сообщение Jul 9 2007, 07:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 29-08-05
Пользователь №: 8 044



Подскажите пож. то сталкивался с сообщением об ошибке "had to relocate PHC" в WINAVR.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Guest_Serg79_*
сообщение Jul 10 2007, 05:16
Сообщение #2





Guests






Я вот никак не пойму, баг это компилятора или нет.
Вот такой код не хочет работать:
Код
/* main.c */
#include <stdint.h>

/* масив для сортировки */
char buff[] = "jsgewkjhcn";

/* сортировка массива методом вставки */
void sort_insert(uint8_t *items, uint8_t size)
{
    uint8_t i,j,temp;

    for( i=1; i < size; i++ )
    {
        temp = items[i];
        for( j=i-1; (j < size) && (items[j] > temp); j-- )
            items[j+1] = items[j];
        items[j+1] = temp;    // этот оператор не хочет работать
        //items[++j] = temp;  // а вот этот отлично работает
    }
}

/* точка входа в программу */
int main(void)
{
    sort_insert(buff,sizeof(buff));
    return 0;
}

Проблема с индексацией массива. Может кто встречался с подобной проблеммой.

Хотя, я уже начинаю сомниваться, не в моей ли голове эта проблема, т.к. такой глюк у меня был и в предыдущих версиях GCC. А проблема достаточно очевидна и впринципе я так думаю, что еслибы это было багом, то он бы давно был исправлен (хотя кто его знает).

P.S. Включение оптимизации на результат не влияет.

Версия GCC:
Код
Reading specs from C:/Program Files/WinAVR/lib/gcc/avr/3.4.6/specs
Configured with: ../gcc-3.4.6/configure --prefix=/c/WinAVR --target=avr --enable-languages=c,c++ --with-dwarf2 --enable-win32-registry=WinAVR --disable-nls
Thread model: single
gcc version 3.4.6
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 10 2007, 06:42
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Индекс масива имеет тип unsigned int.

Расмотрим случай когда j = 0xFF:
1. Оператор items[j+1] = temp; преобразуеться в
items[(unsigned int)j+1] = temp;
-> items[(unsigned int)0xFF+1] = temp;
-> items[0x00FF+1] = temp;
-> items[0x0100] = temp;
-> items[256] = temp; !!!!!!!


2. //items[++j] = temp; // а вот этот отлично работает
items[(unsigned int)(++j)] = temp;
-> items[(unsigned int)(++(0xFF))] = temp;
-> items[(unsigned int)(0x00)] = temp;
-> items[(0x0000)] = temp;
-> items[0] = temp; !!!!!!!!

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

Анатолий.

PS: И петензий мне не надо предьявлять что я должн понимать что не должен. Имя функции говорит только о ее имени, а выполняет функция то что вы написали. И если вы ниписали чуш, то и получите в результате чуш.

PSS: И вообще отладка это немного более сложный процес чем "раз 10 (десять) нажать на кнопку <F11>".

Сообщение отредактировал aesok - Jul 10 2007, 07:16
Go to the top of the page
 
+Quote Post



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

 


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


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