WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 26
Зарегистрирован: Сб май 16, 2015 22:42:01

Сообщение AntonChip »

Спасибо господа. Приведение типов использовал в первую очередь, но чтоб так ставить знак "~" не приходилось
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

AntonChip писал(а):Приведение типов использовал в первую очередь, ...
Извините, но Вы, похоже, заблуждаетесь, или хотите ввести в заблуждение окружающих. Если бы Вы использовали "приведение типов в первую очередь", то сравнение сразу заработало бы и этой темы не было бы. Так что, либо Вы использовали не приведение типов, либо его, но только после того, как Вам на это указали.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Сообщение hybroid »

А объяснить ему доходчиво - язык отсохнет... Попробую я, у меня не отсохнет.
Суть в том, что оператор ~ возвращает результат с типом, используемым по умолчанию. Это int, что и заводит прямо на грабли.
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

hybroid писал(а):оператор ~ возвращает результат с типом ... прямо на грабли.
Ну вот, теперь он точно не прочтет те разделы, незнание которых rised эти грабли к жизни. (Boooo! :))))
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 26
Зарегистрирован: Сб май 16, 2015 22:42:01

Сообщение AntonChip »

До того как написать в этот высокоинтеллектуальный форум делал так, не работает:

Код: Выделить всё

if(((unsigned char)ir_code[0] == ~(unsigned char)ir_code[1]) && ((unsigned char)ir_code[2] == ~(unsigned char)ir_code[3]))
{
}
Так работает:

Код: Выделить всё

if(((unsigned char)ir_code[0] == (unsigned char)~ir_code[1]) && ((unsigned char)ir_code[2] == (unsigned char)~ir_code[3]))
{
}
Контактная информация:
Реклама
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

AntonChip писал(а):~(unsigned char)ir_code[1] - так, не работает
То есть, преобразовывали unsigned char в unsigned char же?
До сего дня был уверен, что написать такое не под силу никому. "О, сколько нам открытий чудных...".
Все же прочтите хотя бы немного о языке Си, хотя бы те два раздела... :facepalm: Может тогда простейшие истины перестанут казаться колдовством и слово "высокоинтеллектуальный" обретет свое первоначальное содержание...

________________
- А на горизонте виднелся маааленький ...
- Большой!!!
- ... А на горизонте виднелся большой ... маааленький кораблик...

©
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 26
Зарегистрирован: Сб май 16, 2015 22:42:01

Сообщение AntonChip »

Pnjom-Penb писал(а):Все же прочтите хотя бы немного о языке Си, хотя бы те два раздела... :facepalm: Может тогда простейшие истины перестанут казаться колдовством и слово "высокоинтеллектуальный" обретет свое первоначальное содержание...
А какое содержание еще может быть у слова "высокоинтеллектуальный"?
Контактная информация:
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Сообщение Pnjom-Penb »

AntonChip писал(а):А какое еще содержание может быть у слова "высокоинтеллектуальный"?
См. сами. :)))

Для сравнения:
  • - Да вы напрасно его прелестным ругаете.
© "С.с.", МАБ
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 26
Зарегистрирован: Сб май 16, 2015 22:42:01

Сообщение AntonChip »

Pnjom-Penb, спасибо
Контактная информация:
Родился
Сообщения: 11
Зарегистрирован: Ср июл 22, 2009 18:05:46
Откуда: Россия

Сообщение TheAbcs »

Надеюсь, вопрос по makefile будет в тему...
Я очень начинающий WinAvr пользователь, поэтому, вероятно, спрошу глупость.
Объясните (или направьте - где можно почитать, беглый гуглопоиск не помог), что значат строчки в makefile:
OPT_DEFS += -DPS2_USE_USART
и
PS2_USE_USART = yes

И еще одно - я запускаю make из "консоли" (cmd). При работе он выводит ну очень много - полезной, как оказалось,- инфы. Как ее загнать в один файл - а то буфер не бесконечен и начальная часть теряется. В два файла (1>1.txt 2>2.txt) я научился, но ведь наверняка есть способ проще...
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Используется ли где-то в коде макрос PS2_USE_USART?
make > file.txt не работает?
Родился
Сообщения: 11
Зарегистрирован: Ср июл 22, 2009 18:05:46
Откуда: Россия

Сообщение TheAbcs »

COKPOWEHEU писал(а):Используется ли где-то в коде макрос PS2_USE_USART?
у меня сложилось впечатление, что это не макрос, а флаг...
он используется в конструкции
ifdef PS2_USE_USART
SRC += protocol/ps2_usart.c
SRC += protocol/ps2_io_avr.c
OPT_DEFS += -DPS2_USE_USART
endif
но в первом случае файлы не компилируются, в во втором - компилируются
собственно, интересно, что делает "OPT_DEFS += -D"
я ради интереса (в процессе изысканий) попробовал написать
OPT_DEFS += -DPS2_USE_USART = yes
но при компиляции вылезла ошибка на первом же файле - "невозможно найти путь" или что-то подобное...
COKPOWEHEU писал(а):make > file.txt не работает?
интернет говорит, что у make два потока вывода, то есть указанное мною выше
make >1.txt >2.txt
позволяет получить близкое к желаемому, но файла получается два и надо думать, что с чем взаимосвязано (по моменту вывода)
хотя, в общем, все понятно, конечно...
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Что-то мне подсказывает что OPT_DEFS это список опций компилятора и выражение это добавляет к параметрам с которыми запустится компилятор определение PS2_USE_USART.

а строка "SRC += protocol/ps2_usart.c" добавляет к списку подключаемых исходников указанные файлы.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 26, 2015 22:28:05

Сообщение Andrey3885 »

Уважаемые форумчане, я не так давно перешёл на си. При компиляции столкнулся с таким warning-ом (' ... ' may be used uninitialized in this function), при чём в разных проэктах. Привожу пример, где получаю такое придупреждение (это только пример, реальные функции сложнее):

void func()
{
unsigned char status=0b10000010;
unsigned char X, Y;

do{

if(status&(1<<1)
X=5;

...


Y=X+3;

...

PORTB=Y;


status=Console();

...

} while(status&(1<<7));

}

В Протеусе всё работает, но я хочу понять, чем вызвано это предупреждение и что с ним делать? Веть по логике алгоритма X как минимум один раз будет инициализирована.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Andrey3885 писал(а):if(status&(1<<1)
X=5;
благодаря аккуратности форматирования вашего кода невозможно понять, является ли X=5 единственным оператором блока if или нет. однако, при любом раскладе если условие if не будет выполнено, переменная X окажется не инициализированной.

отслеживать содержимое глобальных переменных, и переменных, меняемых в других функциях, компилятор не может, поэтому не понимает, выполнится ли и когда именно ваше условие, потому на всякий случай предупреждает, что переменная может оказаться с непредсказуемым значением.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Ну и, более того, тут нет закрывающей скобки в условии if.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

WiseLord писал(а):Ну и, более того, тут нет закрывающей скобки в условии if.
я о том и писал:
ARV писал(а):благодаря аккуратности форматирования вашего кода
т.к. много кода пропущено, нельзя понять, есть там что-то еще или нет, и было ли оно вообще...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 26, 2015 22:28:05

Сообщение Andrey3885 »

Уважаемый ARV я начинающий, прошу Вас отнестись с пониманием, тепер по сути:
ARV писал(а):благодаря аккуратности форматирования вашего кода невозможно понять, является ли X=5 единственным оператором блока if или нет. однако, при любом раскладе если условие if не будет выполнено, переменная X окажется не инициализированной.
Знакомился с Си по книгам, так вот там по поводу фигурных скобок говорилось, что група оператороров должна быть взята в фигурные скобки, один оператор брать в фигурные скобки не обязательно. У меня в приведённом примере после if(True) выполняется один оператор.
ARV писал(а):отслеживать содержимое глобальных переменных, и переменных, меняемых в других функциях, компилятор не может, поэтому не понимает, выполнится ли и когда именно ваше условие, потому на всякий случай предупреждает, что переменная может оказаться с непредсказуемым значением.
У меня в начале функции при объявлении переменной status, выполняется её инициализация начальным значением 0b10000010. В первой интерации в if проверяется установка бита 1 переменной status, который установлен при инициализации, и соответственно в 1 интерации X присваивается 5. В дальнейшем, X=5 может не выполниться, но как минимум один раз этот оператор выполнится, и X до использования будет инициализирован. Я хочу понять почему компилятор этого не видит.
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 26, 2015 22:28:05

Сообщение Andrey3885 »

WiseLord писал(а):Ну и, более того, тут нет закрывающей скобки в условии if.
Извеняюсь, ошибся, я писал пример в редакторе ответов форума
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Компилятор не настолько умный чтобы рассматривать все возможные ветви условий, тем более ваша переменная могла быть изменена где-то в коде по пути от инициализации до условия. Да и условие могло быть и посложнее.
Компиляторы такие ситуации не разруливают настолько глубоко, этим занимаются отдельные статические анализаторы кода.
Если хотите чтобы начальное значение Х было равно 5 то так и сделайте. Такая инициализация значением переменной X как у вас сомнительна в плане надёжности, хоть алгоритм и очевиден с первого взгляда. Но не всегда будет так.
Контактная информация:
Ответить

Вернуться в «AVR»