MiklPolikov 0 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба Сталкиваюсь в Keil 4.60 c какими-то непонятными эффектами при компиляции кода : Оптимизация выключена (стоит Level -0) Inline__ void CHECK(void) { char i; int data[10]; for(i=0;i<10;i++) data[i]=1; } Смотрю под отладкой стотояние data , и вижу что значения его ячеек не меняются, т.е. строчка data=1; игнорируется, хотя она откомпилирована, программа на неё попадает и там можно поставить точку останова. volatile int data [ 10 ] ; не помогает. Если делаю int data [ 10 ] ; глобальной переменной работает как надо. Вопрос : я чего-то не понимаю, или это какой-то аццкий глюк ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба Если делаю int data [ 10 ] ; глобальной переменной работает как надо. В первом случае локальный массив data не используется при выходе из функции, хоть бы он был и volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
romas2010 1 24 января, 2013 Опубликовано 24 января, 2013 (изменено) · Жалоба Сталкиваюсь в Keil 4.60 c какими-то непонятными эффектами при компиляции кода : Вопрос : я чего-то не понимаю, или это какой-то аццкий глюк ? Это не глюк,это особенности компилятора.Если так на досуге почитать help,то он делает следущее-формальные параметры и локальные переменные он хранит в регистрах соответственно локальной переменной сразу присваивается размер 4 байта,даже если она char.Все,что не разместилось в регистрах,размещается в стековом фрейме.В окне отладки видятся только(!!) "регистрово-размещенные" переменные....все остальное,как говориться -вкладка memory,в поле адреса задать SP и в районе этого адреса минус 30-40 байт примерно наблюдать картину..весь массив размещен в фрейме....вот как-то так вот Изменено 24 января, 2013 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба В окне отладки видятся только(!!) "регистрово-размещенные" переменные.... Это, пардон, где такое написано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MiklPolikov 0 24 января, 2013 Опубликовано 24 января, 2013 · Жалоба Я заметил ещё вот что : Адрес по которому содержится локальная переменная меняется сам собой, после возврата программы из функции . Т.е. в функции объявлена переменная, ей присваивается значение. Потом программа уходит во вложенную функцию, возвращается из неё, и адрес переменной сменился. А значение переменной осталось по тому адресу что был раньше. Причём в keil 4.52(кажется) этот же код работал, ничего подобного c локальными переменными не происходило. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 25 января, 2013 Опубликовано 25 января, 2013 · Жалоба Оптимизация выключена (стоит Level -0) Думаю что нет ни одной причины использовать такой низкий уровень оптимизации. У меня во всез проектах для keil в ДЕБАГ конфигурации установлен O1. И не было ещё ни разу желания опускать его ниже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 января, 2013 Опубликовано 26 января, 2013 · Жалоба ЭТО ГЛЮК!!!!! сам 2 часа втыкал. если вы после цикла присвоите какой то переменной что-то из массива, там будет 1. И все проверки пройдет. Со всеми локальными масивами такая беда, сделайте его глобальным и все сразу заработает... Подчеркиваю это только глюк отображения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться