а во-вторых - если все так хорошо, как вы говорите - почему у товарища траблы с тем, что объявленная signed char переменная не анализируется на значение меньше нуля? согласен, причины могут быть и не в типе - но я сужу лишь по тому, что сказано на форуме.
В том и дело, что этот "товарищ" только говорит что траблы. Пусть выкладывает проект, тем самым подкрепляет свои слова. А то Вы тут почти глотки друг другу рвете, а толку то?
А то Вы тут почти глотки друг другу рвете, а толку то?
какие глотки?! ведется цивилизованная корректная дискуссия просто есть 2 мнения, одно у tych-a, а другое - неверное это была шутка, чтобы tych не прицепился к словам
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Пт май 23, 2008 23:59:37 Сообщений: 115 Откуда: Москва
Рейтинг сообщения:0
mr.Kirill писал(а):
В том и дело, что этот "товарищ" только говорит что траблы. Пусть выкладывает проект, тем самым подкрепляет свои слова. А то Вы тут почти глотки друг другу рвете, а толку то?
Я думал, что написать три сроки для проверки проще чем качать файло.
Прикладываю, по просьбе "товарища".
Вложения:
Комментарий к файлу: проект+исходники signed_char.rar [76.78 KiB]
Скачиваний: 314
Зарегистрирован: Пт май 23, 2008 23:59:37 Сообщений: 115 Откуда: Москва
Рейтинг сообщения:0
Надеюсь товарищи практики пример глянули, галочки тоже потыкали и выводы сделали.
Для тех кто верит на слово. От галочек результат не меняется да и меняться не должен. Получается, что в данном случае в сравнении 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
tych, в Си переменные инициализируются нулевым значением всегда, если не объявлено иное. это стандарт...
Увы компиляторы про это не знают .
Не веришь? Посмотри асм после компиляции что у пиков что у авр что на компе...
Если при обьявление не было иницилизации , то в ячейках мусор.
tych, в Си переменные инициализируются нулевым значением всегда, если не объявлено иное. это стандарт...
Увы компиляторы про это не знают . Не веришь? Посмотри асм после компиляции что у пиков что у авр что на компе... Если при обьявление не было иницилизации , то в ячейках мусор.
на Си работаю недавно - со 100% гарантией про компиляторы не скажу, но сомнения в справедливости только что вами сказанного есть. WinAVR мусор не создает, инициализирует все, как положено, нулями - можете посмотреть. Другие современные языки программирования тоже инициализируют нулями все: Delphi (кроме типа real), Java...
Я думаю, что если "компилятор об этом не знает", то это либо плохой компилятор, либо (что скорее всего), чего-то не знаете вы и принимаете за проблему корректное поведение.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
А какой создает ? Вы думаете в компилятор встроена функция создания мусора ?
Компиялтор отводит память под переменную, и если ей не присвоено значение то в это место он ни чего не записывает - поэтому в этих ячейках памяти лежит то что лежало.
ARV писал(а):
WinAVR инициализирует все, как положено, нулями - можете посмотреть.
Он может еще и пирожки выпекать параллельно - но к Си то это какое отношение имеет ?
ARV писал(а):
можете посмотреть.
Где ? Че проект не цепляется ? Или вы не знаете как его к посту прицепить ?
_________________ Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Скачал и поставил WinAVR, сделал проектик - по АСМ листингу переменные размещены по адресам 62h 63h 60h - но в листинге я не вижу (я не спец по АСМу) где эти адреса обнуляются как грозился ARV. Я не утверждаю что там нет обнуления, просто прошу более опытных товарищей указать где оно.
Кстати в листинге путаница - в начале МЭЙН написан АСМ код, а потом строчка на Си которую онвыполнил, дальше уже все в обычном порядке - вначале Си а затем реализующий это АСМ.
с листингом у WinAVR давние траблы - после прохода оптимизатора нарушается разделение на операторы - ассемблерный код получается более компактным и уже не делится на отдельные сишные операторы - поэтому в листинге выводится порой бог знает что... сейчас еще хорошо - в предыдущих версиях вы бы видели, что там выводилось... если отключить оптимизацию - то листинг немного красивеее, но все равно далек от идеала... вы еще поглядите на листинг цикла какого-нибудь там вообще сразу не поймешь, откуда что начинается и где заканчивается
что касается инициализации - она происходит до входа в функцию main() - на этапе инициализации. если интересно - могу подробно рассказать (я это дело изучил весьма основательно), но гораздо проще запустить отладчик в AVR Studio и посмотреть в Watch - все переменные будут обнулены, если явно не проинициализированы.
tych, неужели вы и в самом деле думаете, что исполнение программы, написанной на Си начинается именно с main()?! а где тогда по-вашему стек устанавливается, вы же в main() не пишите инициализацию SP... выходит, есть еще какой-то код, предваряющий main() - вот там и происходит инициализация переменных, в том числе и обнуление по умолчанию. кстати, а присваивание проинициализированным переменным их значений вы нашли в своем листинге?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
что касается инициализации - она происходит до входа в функцию main() - на этапе инициализации. если интересно - могу подробно рассказать (я это дело изучил весьма основательно)
Я и прошу от вас этого - показать асм код (в том листинге или (прошивке дизасм) что сделал WinAVR) который вписывает нули в адреса переменных.
ARV писал(а):
но гораздо проще запустить отладчик в AVR Studio и посмотреть в Watch - все переменные будут обнулены, если явно не проинициализированы.
Ваааааааааааще ОТЖИХХХХХ ! Корки отмачиваете не шуточные ! Откудаж в СИМУЛЯТОРЕ возьметься мусор в ячейках памяти ? Симулятор РОДИТ его чтоль ?
Вы полагаете что если код написать на CVAVR то в студии не будет нулей в переменных ? В листинге CVAVR есть специальный макрос очищающий всю оперативн память - не знаю задействует ли он его в каждой проге или нет.
В реальном процессоре "мусор" в ячейках памяти может остаться после ресета - не ужели НЕ ЯСНО ?
Если в симуляторе есть фича сохранять содержимое памяти при РЕСЕТЕ - то мусор КОНЕЧНО будет если до РЕСЕТа в эти ячейки вписать что-то не нулевое и если нет ЯВНОГО АСМ кода очищающего эти ячейки при старте программы.
ARV писал(а):
tych, неужели вы и в самом деле думаете, что исполнение программы, написанной на Си начинается именно с main()?!
Так оно и есть на самом деле - программа на Си начинает выполняться с мэйн обычно.
ARV писал(а):
а где тогда по-вашему стек устанавливается, вы же в main() не пишите инициализацию SP...
Там где компилятор "ЗАТОЧЕНЫЙ" ПОД АРХИТЕКТУРУ процессора накомпилит - видно в ЛИСТИНГЕ ЯВНО !
ARV писал(а):
выходит, есть еще какой-то код, предваряющий main()
Как вы догадались ?Наверно в листинге .lss - кторый я приложил выше - увидели ?
ARV писал(а):
вот там и происходит инициализация переменных, в том числе и обнуление по умолчанию.)
ПОКАЖИТЕ ГДЕ ???? Я ж выложил вам АСМ код в архиве и написал что я не спец по АСМ-у и попросил вам показать где нули вписываются !
ARV писал(а):
а присваивание проинициализированным переменным их значений вы нашли в своем листинге?
Естественно НЕТ ! Опять дурачком прикидываетесь ??? WinAVR имдиЁт чтоль ? Он чтоль не видит что переменная не считвается в коде до записи в нее, нафигаж он будет писать в нее то что не требуется - ОПТИМИЗАЦИЯ то включена !
Вот если в проге добавить чтение из этой переменной, до записи в нее нового значения, то компилер ВЫНУЖДЕН будет вписать (запомнить) присвоеное ей при инициализации значение. Хотя если оптимизацию не выключить он может и схитрить - сразу вычислить значение результата в первое месте где в проге она появится.
_________________ Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения