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

 
 
 
Reply to this topicStart new topic
> И снова Wiggler & IAR., Не понятно, почему не работают функции сравнения
bolmoe
сообщение Feb 16 2007, 12:06
Сообщение #1


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

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



smile3046.gif
Никто не сталкивался с тем, что при отладке в IAR функции memcmp(), strcmp() не сравнивают, хотя физически видно в памяти, что символы совпадают. ???
Кристалл LPC2148, компилер IAR 4.40А
Еще замечено, что при описании струтуры
к пр. typedef struct __SSS{....}sss;
main()
{
sss s;
sss *p;

p=&s;
}

в 'р' не передается адрес струтуры 's', приходится работать через р=malloc() || р=calloc(), хотя опять же видно, что под 's' память выделяется ????

Возможно, что требуются какие то настройки в дебаггере?
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 16 2007, 13:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Как это memcmp не сравнивает? В чём это выражается? Может быть, при сравнении структур мешают padding байты? Пробовали пройти по шагам по дизассемблеру?
Ну а отсутствие присваивания напоминает трюки оптимизатора: он может довольно сильно покорёжить код, усложняя отладку. Попробуйте поставить уровень оптимизации на минимум. Или вставьте нетривиальную обработку этой самой переменной p, чтобы оптимизатор её не выкинул.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 16 2007, 14:12
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(scifi @ Feb 16 2007, 12:27) *
Или вставьте нетривиальную обработку этой самой переменной p, чтобы оптимизатор её не выкинул.
Достаточно завести глобальную переменную такого же типа как и p и присвоить p ей.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
bolmoe
сообщение Feb 16 2007, 14:13
Сообщение #4


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

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



Цитата(scifi @ Feb 16 2007, 13:27) *
Как это memcmp не сравнивает? В чём это выражается? Может быть, при сравнении структур мешают padding байты? Пробовали пройти по шагам по дизассемблеру?
Ну а отсутствие присваивания напоминает трюки оптимизатора: он может довольно сильно покорёжить код, усложняя отладку. Попробуйте поставить уровень оптимизации на минимум. Или вставьте нетривиальную обработку этой самой переменной p, чтобы оптимизатор её не выкинул.


Оптимизация на -> Low
а в проге стоит так - if(! memcmp(buf,"бла-бла-бла",11)){...............};else {..........}
заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал....
Сейчас только еще один прикол выпал, отказывается делить величины типа DWORD, причем при делении, к примеру, на 400 все ок, делю на 1500 висяк тут же, с чем связано, тоже пока не понимаю
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 16 2007, 17:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(bolmoe @ Feb 16 2007, 14:13) *
заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал....

Ничего из написанного не понимаю, поэтому ничего и посоветовать не смогу. Кстати, процессор ARM позволяет каждую инструкцию выполнять или не выполнять по условию, без ветвлений. Компилятор этим часто пользуется, и проявляется это в том, что процессор выполняет обе ветки IF, но эффект имеет только одна из них. Тоже может ввести в заблуждение при отладке.
Ну а низший уровень оптимизации - это не Low, а None.
Go to the top of the page
 
+Quote Post
bolmoe
сообщение Feb 16 2007, 17:32
Сообщение #6


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

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



Цитата(scifi @ Feb 16 2007, 17:07) *
Цитата(bolmoe @ Feb 16 2007, 14:13) *

заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал....

Ничего из написанного не понимаю, поэтому ничего и посоветовать не смогу. Кстати, процессор ARM позволяет каждую инструкцию выполнять или не выполнять по условию, без ветвлений. Компилятор этим часто пользуется, и проявляется это в том, что процессор выполняет обе ветки IF, но эффект имеет только одна из них. Тоже может ввести в заблуждение при отладке.
Ну а низший уровень оптимизации - это не Low, а None.


ВСЕМ СПАСИБО! РАЗОБРАЛСЯ! НЕДАВНО В IAR, поэтому и глупые ошибки по незнанию! Размер STACK и HEAP надо просто указывать достаточные для работы программы...
Go to the top of the page
 
+Quote Post

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

 


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


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