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

 
 
> И снова 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
 
Start new topic
Ответов
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
bolmoe
сообщение Feb 16 2007, 14:13
Сообщение #3


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

Группа: Свой
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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



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

 


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


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