|
|
  |
И снова Wiggler & IAR., Не понятно, почему не работают функции сравнения |
|
|
|
Feb 16 2007, 12:06
|

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

|
Никто не сталкивался с тем, что при отладке в IAR функции memcmp(), strcmp() не сравнивают, хотя физически видно в памяти, что символы совпадают. ??? Кристалл LPC2148, компилер IAR 4.40А Еще замечено, что при описании струтуры к пр. typedef struct __SSS{....}sss; main() { sss s; sss *p; p=&s; } в 'р' не передается адрес струтуры 's', приходится работать через р=malloc() || р=calloc(), хотя опять же видно, что под 's' память выделяется ???? Возможно, что требуются какие то настройки в дебаггере?
|
|
|
|
|
Feb 16 2007, 14:13
|

Частый гость
 
Группа: Свой
Сообщений: 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 висяк тут же, с чем связано, тоже пока не понимаю
|
|
|
|
|
Feb 16 2007, 17:07
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(bolmoe @ Feb 16 2007, 14:13)  заходит в процедуру и отттуда, после первого сравнеия, вываливается, хотя в памяти видно, что символы стоят те же, что и "бла-бла-бла". Поборол тем, что посимвольно по if() отработал.... Ничего из написанного не понимаю, поэтому ничего и посоветовать не смогу. Кстати, процессор ARM позволяет каждую инструкцию выполнять или не выполнять по условию, без ветвлений. Компилятор этим часто пользуется, и проявляется это в том, что процессор выполняет обе ветки IF, но эффект имеет только одна из них. Тоже может ввести в заблуждение при отладке. Ну а низший уровень оптимизации - это не Low, а None.
|
|
|
|
|
Feb 16 2007, 17:32
|

Частый гость
 
Группа: Свой
Сообщений: 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 надо просто указывать достаточные для работы программы...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|