14.04.2013, 10:52
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Что-то не пойму где глюк, или в IAR или в STM8S105 ил я что-то не понимаю.
Вот такая функция
Код:
|
unsigned char up(uart_buf_pos)
{
unsigned char bb,aа;
for(bb=1;bb‹uart_buf_pos;bb+=2) a++;
return aa;
} |
Так вот это функция при каждом входе в неё возвращает значение aa плюс значение предыдущего входа , что за хрень я не объявлял её как static?По идеи при каждом входе в эту функцию эта переменная должна иметь значение 0.
Последний раз редактировалось stmfaq; 14.04.2013 в 10:55.
|
|
|
|
14.04.2013, 11:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от stmfaq
|
По идеи при каждом входе в эту функцию эта переменная должна иметь значение 0.
|
С какой стати " она должна"? Откуда взято такое требование? Рекомендую проверить её значение прямо на входе - если программу не менять, то оно будет равно предыдущему, возвращенному функцией up... Почему так? И почему только, если программу не менять?
Все глюки компиляторов локализуются в голове их пользователей.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 14.04.2013 в 11:57.
|
|
|
Сказали "Спасибо" tempora
|
|
|
14.04.2013, 13:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от stmfaq
|
Что-то не пойму где глюк, или в IAR или в STM8S105 ил я что-то не понимаю.
Вот такая функция
Код:
|
unsigned char up(uart_buf_pos)
{
unsigned char bb,aа;
for(bb=1;bb‹uart_buf_pos;bb+=2) a++;
return aa;
} |
|
Объявили aa без инициализации. В теле функции НИЧЕГО с ней не делали. Какое значение будет иметь aa на выходе?
Допустим, в теле цикла ачепятка. В таком случае какое вы имеете право производить любые действия с неинициализированной переменной? Какое ожидаете получить значение?
Возможно, вы имели ввиду так:
Код:
|
unsigned char up(uart_buf_pos)
{
unsigned char bb,aа = 0x00;
for(bb=1;bb‹uart_buf_pos;bb+=2) aa++;
return aa;
} |
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
14.04.2013, 13:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,799
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: FAQ по STM8
Насколько я знаю, обнуляются только глобально объявленные переменные. Используя это правило ошибок не встречал.
|
|
|
|
14.04.2013, 16:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
stmfaq, так Вы нашли, почему значение сохраняется, или просто воспользовались готовым решением, предоставленным доброхотами?
__________________
There's always more than one way to skin a cat.
|
|
|
|
14.04.2013, 16:13
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
stmfaq, так Вы нашли, почему значение сохраняется, или просто воспользовались готовым решением, предоставленным доброхотами?
|
Да ничего не нашел, просто инициализировал переменную нулевым значением и все. Дело в том что на AVR и компиляторе CV , этот же код работал нормально, без присвоения нулевого значения переменной.
|
|
|
|
14.04.2013, 16:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от stmfaq
|
на AVR и компиляторе CV , этот же код работал нормально, без присвоения нулевого значения переменной.
|
Строго говоря, этот код может работать так, как Вы этого ожидаете, только в силу случайного стечения обстоятельств. Рассчитывать на то, что CV - это компилятор, не следует, слишком много в нем глюков/ошибок.
Если Вы не вникли в ситуацию, то в следующий раз наступите на те же грабли - не обидно тратить на них время? И хорошо еще, если эти грабли обнаружатся на ранней стадии, а если они всплывут уже в готовом устройстве, и оно сделает то, чего делать ни в коем случае нельзя?
Решать Вам, конечно, но стоит-таки докопаться до сути. Рекомендую сначала ознакомиться с описанием классов памяти, а затем взглянуть на код, сгенеренный компилятором для этого участка программы.
__________________
There's always more than one way to skin a cat.
|
|
|
|
14.04.2013, 16:25
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от andries5
|
Насколько я знаю, обнуляются только глобально объявленные переменные. Используя это правило ошибок не встречал.
|
Может наоборот, глобальные переменные не обнуляются. Вообще то локальная переменная существует только во время выполнения программного блока,в котором она объявлена, создается она при входе в блок , а удаляется при выходе из него.Это значит, что локальная переменная не сохраняет свое значение в период между вызовами, а для того чтобы она сохранила значение при повторном входе в функцию где она объявлена нужно объявить её с модификатором static.
Но похоже что в IAR все не так, и противоречит стандартам Си, ил у IAR все локальные переменные используются по умолчанию с модификатором static, хрен его знает,с каких делов при повторном входе в функцию у локальной переменной без модификатора static сохраняется значение.
Последний раз редактировалось stmfaq; 14.04.2013 в 16:31.
|
|
|
|
14.04.2013, 16:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,799
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: FAQ по STM8
При создании локальной переменной она получает случайное значение.
|
|
|
|
14.04.2013, 16:38
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от andries5
|
При создании локальной переменной она получает случайное значение.
|
Не в моем случае , я же написал что при повторном вызове функции у переменной оставалось значение предыдущего результата, это меня и смутило.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:34.
|
|