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

 
 
> Переменная потеряла значение
Beginning
сообщение Nov 23 2007, 10:53
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Столкнулся со следующей проблемой. Компилятор IAR 4.42. Проект превысил 60 кил, и ни каких особых багов я не замечал. Компилил с опцией NONE(BestDebugSupport). Решил откомпилить с опцией Medium и наткнулся на непонятный баг. Из StartUp код прыгает в main там следующий код:
Main()
{
Unsigned int x;
x=calculate_ram_crc();

//Сдесь x=1, как и должно быть

initialisation();
VICIntEnable |= (1<<5);

//Сдесь x=чему угодно???!!!

Кто нибудь сталкивался с таким багом?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Beginning
сообщение Nov 23 2007, 13:14
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Цитата
Я бы спросил точнее: значение переменной x, полученное в результате вызова calculate_ram_crc(), где-нибудь используется? Если нет, то компилятор имеет полное право его выкинуть.

Разумеется. Функция calculate_ram_crc проверяет RAM и возвращает succes или false и соответственно далее в зависимости от результата, идёт разветвление программы, конкретно в моём примере следующим образом:
while(x)
{
...
}
Цитата
Может быть, там были матюки? Если так, то отмодерили.

Да нет???? Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет!
Цитата
Совет по стилю: вместо одной расходной переменной лучше применять разные, чтобы имя переменной в каждой отдельной ситуации поясняло, зачем она используется.

Смысловые переменные конечно имеют уникальные названия, но согласитесь есть очень много мест где переменная требуется максимум на пару строк, тот же самый пресловутый:
Цитата
for(x = 0; x < 8; x++)

Т.к. число регистров у ARM7 весьма ограничено то и приходится использовать переменные повторно. Впринципе, я считаю это обсалютно нормальным.
Цитата
Ещё один совет по стилю: если функция раздулась до сотни строк, значит её надо разбивать на подфункции.

Это я образно выразился. Если кусок кода начинает приобретать лёгкие черты инкапсуляции то он сразу превращается в функцию smile.gif
Ну а теперь вернусь к своим "баранам". Переменную анализирую выводом в терминал. Без оптимизации всё работает отлично. С аптимизацией нет. Пока не копаюсь в дезасемблировании поскольку, даже если найду ущербный код, то это не поможет от него избавится. smile3046.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 23 2007, 13:53
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Beginning @ Nov 23 2007, 15:14) *
А куда мая предыдущая месага делась????
...
Мне кто-то ответил, что сталкивался с таким, я спросил в чём грабдли были. После обеда, пришёл и в придкушении ответа зашёл на форум, а тут не моего ни его ответов нет!

Скрыта вместе с предыдущим бессодержательным ответом.
Сообщения, как и названия тем, должны быть хоть как-то наполнены смыслом.
Go to the top of the page
 
+Quote Post



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

 


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


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