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

 
 
 
Reply to this topicStart new topic
> сообщение об ошибке в 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
aesok
сообщение Jul 9 2007, 09:30
Сообщение #2


Знающий
****

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



Версия avr-gcc?
Go to the top of the page
 
+Quote Post
krik
сообщение Jul 9 2007, 19:05
Сообщение #3


Участник
*

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



Цитата(aesok @ Jul 9 2007, 13:30) *
Версия avr-gcc?



WinAVR - 20060421 , (GCC) 3.4.6
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 9 2007, 19:21
Сообщение #4


Знающий
****

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



Цитата(krik @ Jul 9 2007, 23:05) *
WinAVR - 20060421 , (GCC) 3.4.6


Если я правильно понял - этот баг исправлен в GCC 4.1.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11324 - unimplemented, had to relocate pch
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11341 - [cygwin] [pch] ICE in ggc_pop_context, at ggc-page.c:1441 while compiling libstc++3

Используйте более новую версию WinAVR.

Анатолий.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 10 2007, 05:16
Сообщение #5





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, 05:58
Сообщение #6


Знающий
****

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



Код
        items[j+1] = temp;    // этот оператор не хочет работать
        //items[++j] = temp;  // а вот этот отлично работает

Что значит РАБОТАЕТ/НЕ РАБОТАЕ?????
Обясните что вы ожидаете получить и что получаете в результате работы программы.


Код
char buff[] = "jsgewkjhcn";
....
int main(void)
{
    sort_insert(buff,sizeof(buff));
    return 0;
}


Что вы хотите отсортировать массив buff[] или символы в строке, которая сохранена в массиве buff[]?

Анатолий.
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 10 2007, 06:34
Сообщение #7





Guests






Цитата
Обясните что вы ожидаете получить и что получаете в результате работы программы.

aesok, не уже ли из преведенного кода не понятно что должна делать функция "sort_insert". Она должна отсортировать массив восьми разрядных безнаковых значений по возрастанию, передается ей указатель на массив "uint8_t *items" и размер массива "uint8_t size". Если Вы не знаешь как работает алгоритм сортировки методом вставки, то можешь почитать сдесь: http://algolist.manual.ru/sort/insert_sort.php .

Цитата
Что вы хотите отсортировать массив buff[] или символы в строке, которая сохранена в массиве buff[]
По секрету Вам скажу, что строка есть также массив типа "char" которая содержит дополнительно нулевой символ '\0' в конце.

Ну и для тех, кто не может понять очевидный код я поясняю: после выхода из функции "sort_insert", строка должна быть отсортированна в алфавитном порядке, также замечу, что нулевой символ '\0' в конце массива должен будет находиться уже в его начале. Что на самом деле не происходит. А чтобы данная функция заработала, как от нее ожидается надо закоментировать строку "items[j+1] = temp; // этот оператор не хочет работать" и раскоментировать строку "//items[++j] = temp; // а вот этот отлично работает".

P.S. Кто не верит, может скопировать код (он полностью готов к сборке) и прогнать его из под отладчика. Для понимания того, что функция "sort_insert" начинает работать както не так, понадобиться раз 10 (десять) нажать на кнопку <F11>, это в среде AVR Studio.
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 10 2007, 06:42
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 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
jorikdima
сообщение Jul 10 2007, 07:20
Сообщение #9


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(aesok @ Jul 10 2007, 10:42) *
Индекс масива имеет тип unsigned int.

А не поясните почему?
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 10 2007, 07:32
Сообщение #10





Guests






Вполне возможно, что Вы aesok и правы.

После того, как я немного потправил код таким образом:
Код
items[(uint8_t)(j+1)] = temp;
все заработало.

Вот по этому я и сомневался:
Цитата
Хотя, я уже начинаю сомниваться, не в моей ли голове эта проблема, т.к. такой глюк у меня был и в предыдущих версиях GCC.

А про это
Цитата
Индекс масива имеет тип unsigned int
я не знал. Спасибо, что прояснили ситуацию. Как говориться век живи век учись.

Еще раз спасибо, теперь все встало на свои места.

Цитата(aesok @ Jul 10 2007, 10:42) *
PS: И петензий мне не надо предьявлять что я должн понимать что не должен. Имя функции говорит только о ее имени, а выполняет функция то что вы написали. И если вы ниписали чуш, то и получите в результате чуш.

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

Притензии я не кому не предъявляю. Мне почему то всегда казалось, что разобраться в функции языка 'C' которая состоит из шести строк довольно просто. Это же все таки не 'Perl' где в шести строчках кода можно закодировать целую программу на 'C'.

Насчет десяти нажатий клавиши <F11>, так опять же мне кажется, что этого вполне достаточно что бы увидеть что данная функция начинает работать не так как от нее ожидается. Хотя, я могу и ошибаться.
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 10 2007, 11:18
Сообщение #11


Знающий
****

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



Цитата(Serg79 @ Jul 10 2007, 11:32) *
Насчет десяти нажатий клавиши <F11>, так опять же мне кажется, что этого вполне достаточно что бы увидеть что данная функция начинает работать не так как от нее ожидается. Хотя, я могу и ошибаться.


В моем понимании отладка - это ВЫЯСНЕНИЕ почему код работает именно так как он работает, а не так как ожидаеться.

Анатолий.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 10 2007, 11:30
Сообщение #12


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(aesok @ Jul 10 2007, 10:18) *
В моем понимании отладка - это ВЫЯСНЕНИЕ почему код работает именно так как он работает, а не так как ожидается.
Анатолий.

Ну, эт у вас мистика какая-то, типа код сам знает, как он работает, а вы вот хотите это выяснить.

Отладка - это получение кода, работающего именно так, как задумал автор, ни больше, ни меньше.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 10 2007, 11:40
Сообщение #13


Знающий
****

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



Цитата(=GM= @ Jul 10 2007, 15:30) *
Ну, эт у вас мистика какая-то, типа код сам знает, как он работает, а вы вот хотите это выяснить.


Код работает как он написан, а хотеть я могу совсем другого.


Автор вопроса в этих двух строчках ХОТЕЛ одного и тогоже:
items[j+1] = temp; // этот оператор не хочет работать
items[++j] = temp; // а вот этот отлично работает

Но они работали по разному, и не так как ХОТЕЛ автор, а так как этот код понял компилятор в соответствии со стандартом на язык С.

Анатолий.

Сообщение отредактировал aesok - Jul 10 2007, 11:42
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 10 2007, 12:26
Сообщение #14


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(aesok @ Jul 10 2007, 10:40) *
Код работает как он написан, а хотеть я могу совсем другого.

Не так. Код написан ВАМИ, следовательно, ВЫ хотели, чтобы он работал так-то и так-то, но в силу ряда причин, ваш код работает не так. Ну выяснили вы, почему код работает неправильно, ну и что? Надо же его исправить и опять проверить, именно в этом заключается отладка.

Поэтому так точнее: Отладка - это получение кода, работающего именно так, как задумал автор.

Другими словами, ВЫЯВЛЕНИЕ ошибки и ИСПРАВЛЕНИЕ кода, чтобы он работал так, как ожидается АВТОРОМ.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 10 2007, 19:30
Сообщение #15


Знающий
****

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



да мы про одно и тоже, только разными словами.

Цитата(=GM= @ Jul 10 2007, 16:26) *
Поэтому так точнее: Отладка - это получение кода, работающего именно так, как задумал автор.


Полностью согласен.

Анатолий.
Go to the top of the page
 
+Quote Post

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

 


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


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