Страница 19 из 421
Добавлено: Вт сен 23, 2008 13:15:21
mr.Kirill
ARV писал(а):а во-вторых - если все так хорошо, как вы говорите - почему у товарища траблы с тем, что объявленная signed char переменная не анализируется на значение меньше нуля? согласен, причины могут быть и не в типе - но я сужу лишь по тому, что сказано на форуме.
В том и дело, что этот "товарищ" только говорит что траблы. Пусть выкладывает проект, тем самым подкрепляет свои слова. А то Вы тут почти глотки друг другу рвете, а толку то?
Добавлено: Вт сен 23, 2008 13:21:38
ARV
mr.Kirill писал(а):А то Вы тут почти глотки друг другу рвете, а толку то?
какие глотки?! ведется цивилизованная корректная дискуссия

просто есть 2 мнения, одно у
tych-a, а другое - неверное
это была шутка, чтобы tych не прицепился к словам 
Добавлено: Вт сен 23, 2008 14:12:07
Telek
mr.Kirill писал(а):
В том и дело, что этот "товарищ" только говорит что траблы. Пусть выкладывает проект, тем самым подкрепляет свои слова. А то Вы тут почти глотки друг другу рвете, а толку то?
Я думал, что написать три сроки для проверки проще чем качать файло.
Прикладываю, по просьбе "товарища".
Добавлено: Вт сен 23, 2008 21:24:10
tych
У меня отрицательные числа получаются при компиляции и в cvavr 1.25.9 pro и в cvavr 2.03.2
Proteus 7.4 выводит и текст (я добавил в прогу) и цифры, а 7.2sp6 только цифры ! В VMLAB не проверял.
Добавлено: Вт сен 23, 2008 21:28:17
Telek
Надеюсь товарищи практики пример глянули, галочки тоже потыкали и выводы сделали.
Для тех кто верит на слово. От галочек результат не меняется да и меняться не должен. Получается, что в данном случае в сравнении signed char выступает как unsigned char.
Код: Выделить всё
signed char c;
signed char z;
c=2;
z=0;
while (1)
{
c--;
if (c<0) c=2;
//if (c<z) c=2;
//if (c==-1) c=2;
printf("c=%i\n\r",c);
delay_ms(500);
};
В этом коде, если раскомментировать ифы при значении "с" меньше нуля сработает только третий(соответственно при с=-1).
Поэтому, получается что нормально использовать сравнение отрицательных чисел не получается. Как вариант выхода из ситуации - юзать переменные типа int в ущерб памяти.
Если необходимо сравнить с нулем( меньше нуля), как в моем случае, то можно написать например так: if (c<-1) c=2; или if (c<-22) c=2;

или любое число меньше 0... результат будет верный(сравнение будет как с нулем), но выглядеть будет дико.
ЗЫ. Данный глюк одинаков в 1.5.х и 2.0.х. Что это, баг или фича производителя - х.з. Возможно это одно из проявлений указанного тут красным шрифтом
http://www.hpinfotech.ro/html/download.htm
Добавлено: Вт сен 23, 2008 21:40:26
Telek
tych писал(а):У меня отрицательные числа получаются при компиляции и в cvavr 1.25.9 pro и в cvavr 2.03.2
Proteus 7.4 выводит и текст (я добавил в прогу) и цифры, а 7.2sp6 только цифры ! В VMLAB не проверял.
т.е. считаем что глюк Протеуса 7.2? у меня SP2
картинко, это твой пример в 7.2sp2... т.е. как бы без изменений - глюк есть.
Добавлено: Вт сен 23, 2008 22:02:09
ARV
о как!!!
ну что вам стоит пользоваться законно бесплатным софтом? который не только правильно работает, но и позволяет не чувствовать себя вором?!
Добавлено: Вт сен 23, 2008 22:05:35
tych
в Proteus 7.4 сравнение с нулем работает
а в 7.2 sp6 НЕТ
Добавлено: Вт сен 23, 2008 22:06:15
Telek
ARV писал(а): о как!!!
ну что вам стоит пользоваться законно бесплатным софтом? который не только правильно работает, но и позволяет не чувствовать себя вором?!
Судя по последним сообщениям, получается глюк Протеуса...
Добавлено: Вт сен 23, 2008 22:07:40
ARV
а протеус у вас легально купленный?!?!

Добавлено: Вт сен 23, 2008 22:27:41
Telek
ARV писал(а):а протеус у вас легально купленный?!?!

а есть бесплатная/разумно стоящая для частного юзера замена?
Добавлено: Вт сен 23, 2008 22:28:44
ARV
да, называется макетная плата

и пользы на порядок больше!
Добавлено: Вт сен 23, 2008 22:40:40
dosikus
ARV писал(а):tych, в Си переменные инициализируются нулевым значением всегда, если не объявлено иное. это стандарт...
Увы компиляторы про это не знают .
Не веришь? Посмотри асм после компиляции что у пиков что у авр что на компе...
Если при обьявление не было иницилизации , то в ячейках мусор.
Добавлено: Вт сен 23, 2008 23:00:52
tych
Telek писал(а):ARV писал(а):а протеус у вас легально купленный?!?!

а есть бесплатная/разумно стоящая для частного юзера замена?
VMLAB бесплатный и 4 Мб всего. В моей домашней страничке позырь.
Но PROTEUS - ИМХО великолепен !
Добавлено: Ср сен 24, 2008 07:03:52
ARV
dosikus писал(а):ARV писал(а):tych, в Си переменные инициализируются нулевым значением всегда, если не объявлено иное. это стандарт...
Увы компиляторы про это не знают .
Не веришь? Посмотри асм после компиляции что у пиков что у авр что на компе...
Если при обьявление не было иницилизации , то в ячейках мусор.
на Си работаю недавно - со 100% гарантией про компиляторы не скажу, но сомнения в справедливости только что вами сказанного есть.
WinAVR мусор не создает, инициализирует все, как положено, нулями - можете посмотреть. Другие современные языки программирования тоже инициализируют нулями все: Delphi (кроме типа real), Java...
Я думаю, что если "компилятор об этом не знает", то это либо плохой компилятор, либо (что скорее всего), чего-то не знаете вы и принимаете за проблему корректное поведение.
Добавлено: Ср сен 24, 2008 07:16:46
tych
Хоть кол на голове теши ...
Добавлено: Ср сен 24, 2008 07:23:05
tych
ARV писал(а): WinAVR мусор не создает
А какой создает ? Вы думаете в компилятор встроена функция создания мусора ?
Компиялтор отводит память под переменную, и если ей не присвоено значение то в это место он ни чего не записывает - поэтому в этих ячейках памяти лежит то что лежало.
ARV писал(а): WinAVR инициализирует все, как положено, нулями - можете посмотреть.
Он может еще и пирожки выпекать параллельно -
но к Си то это какое отношение имеет ?
ARV писал(а): можете посмотреть.
Где ? Че проект не цепляется ? Или вы не знаете как его к посту прицепить ?
Добавлено: Ср сен 24, 2008 08:57:30
tych
Скачал и поставил WinAVR, сделал проектик - по АСМ листингу переменные размещены по адресам 62h 63h 60h - но в листинге я не вижу (я не спец по АСМу) где эти адреса обнуляются
как грозился ARV. Я не утверждаю что там нет обнуления, просто прошу более опытных товарищей указать где оно.
Кстати в листинге путаница - в начале МЭЙН написан АСМ код, а потом строчка на Си которую онвыполнил, дальше уже все в обычном порядке - вначале Си а затем реализующий это АСМ.
Код: Выделить всё
void main(void) {
5e: 83 e0 ldi r24, 0x03 ; 3
60: 80 93 62 00 sts 0x0062, r24
aba = 3;
top = 5;
64: 85 e0 ldi r24, 0x05 ; 5
66: 80 93 63 00 sts 0x0063, r24
Добавлено: Ср сен 24, 2008 17:40:08
ARV
с листингом у
WinAVR давние траблы - после прохода оптимизатора нарушается разделение на операторы - ассемблерный код получается более компактным и уже не делится на отдельные сишные операторы - поэтому в листинге выводится порой бог знает что... сейчас еще хорошо - в предыдущих версиях вы бы видели, что там выводилось...

если отключить оптимизацию - то листинг немного красивеее, но все равно далек от идеала... вы еще поглядите на листинг цикла какого-нибудь

там вообще сразу не поймешь, откуда что начинается и где заканчивается
что касается инициализации - она происходит до входа в функцию
main() - на этапе инициализации. если интересно - могу подробно рассказать (я это дело изучил весьма основательно), но гораздо проще запустить отладчик в AVR Studio и посмотреть в
Watch - все переменные будут обнулены, если явно не проинициализированы.
tych, неужели вы и в самом деле думаете, что исполнение программы, написанной на Си начинается именно с
main()?! а где тогда по-вашему стек устанавливается, вы же в
main() не пишите инициализацию
SP... выходит, есть еще какой-то код, предваряющий
main() - вот там и происходит инициализация переменных, в том числе и обнуление по умолчанию. кстати, а присваивание проинициализированным переменным их значений вы нашли в своем листинге?

Добавлено: Ср сен 24, 2008 18:40:52
tych
ARV писал(а): что касается инициализации - она происходит до входа в функцию main() - на этапе инициализации. если интересно - могу подробно рассказать (я это дело изучил весьма основательно)
Я и прошу от вас этого - показать асм код (в том листинге или (прошивке дизасм) что сделал WinAVR) который вписывает нули в адреса переменных.
ARV писал(а): но гораздо проще запустить отладчик в AVR Studio и посмотреть в Watch - все переменные будут обнулены, если явно не проинициализированы.
Ваааааааааааще ОТЖИХХХХХ ! Корки отмачиваете не шуточные !
Откудаж в СИМУЛЯТОРЕ возьметься мусор в ячейках памяти ? Симулятор РОДИТ его чтоль ?
Вы полагаете что если код написать на CVAVR то в студии не будет нулей в переменных ? В листинге CVAVR есть специальный макрос очищающий всю оперативн память - не знаю задействует ли он его в каждой проге или нет.
В реальном процессоре "мусор" в ячейках памяти может остаться после ресета -
не ужели НЕ ЯСНО ?
Если в симуляторе есть фича сохранять содержимое памяти при РЕСЕТЕ - то мусор КОНЕЧНО будет если до РЕСЕТа в эти ячейки вписать что-то не нулевое и если нет ЯВНОГО АСМ кода очищающего эти ячейки при старте программы.
ARV писал(а): tych, неужели вы и в самом деле думаете, что исполнение программы, написанной на Си начинается именно с main()?!
Так оно и есть на самом деле - программа на Си начинает выполняться с мэйн обычно.
ARV писал(а): а где тогда по-вашему стек устанавливается, вы же в main() не пишите инициализацию SP...
Там где компилятор "ЗАТОЧЕНЫЙ" ПОД АРХИТЕКТУРУ процессора накомпилит -
видно в ЛИСТИНГЕ ЯВНО !
ARV писал(а): выходит, есть еще какой-то код, предваряющий main()
Как вы догадались ? Наверно в листинге .lss - кторый я приложил выше - увидели ?
ARV писал(а): вот там и происходит инициализация переменных, в том числе и обнуление по умолчанию.)
ПОКАЖИТЕ ГДЕ ???? Я ж выложил вам АСМ код
в архиве и написал что
я не спец по АСМ-у и попросил вам показать где нули вписываются !
ARV писал(а): а присваивание проинициализированным переменным их значений вы нашли в своем листинге?

Естественно НЕТ !
Опять дурачком прикидываетесь ???
WinAVR имдиЁт чтоль ? Он чтоль не видит что
переменная не считвается в коде до записи в нее, нафигаж он будет писать в нее то что не требуется - ОПТИМИЗАЦИЯ то включена !
Вот если в проге добавить чтение из этой переменной, до записи в нее нового значения, то компилер ВЫНУЖДЕН будет вписать (запомнить) присвоеное ей при инициализации значение. Хотя если оптимизацию не выключить он может и схитрить - сразу вычислить значение результата в первое месте где в проге она появится.