WinAvr в вопросах и ответах
- Сообщения: 26
- Зарегистрирован: Сб май 16, 2015 22:42:01
Спасибо господа. Приведение типов использовал в первую очередь, но чтоб так ставить знак "~" не приходилось
- Реклама
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Извините, но Вы, похоже, заблуждаетесь, или хотите ввести в заблуждение окружающих. Если бы Вы использовали "приведение типов в первую очередь", то сравнение сразу заработало бы и этой темы не было бы. Так что, либо Вы использовали не приведение типов, либо его, но только после того, как Вам на это указали.AntonChip писал(а):Приведение типов использовал в первую очередь, ...
А объяснить ему доходчиво - язык отсохнет... Попробую я, у меня не отсохнет.
Суть в том, что оператор ~ возвращает результат с типом, используемым по умолчанию. Это int, что и заводит прямо на грабли.
Суть в том, что оператор ~ возвращает результат с типом, используемым по умолчанию. Это int, что и заводит прямо на грабли.
- Сообщения: 469
- Зарегистрирован: Вс авг 30, 2015 03:52:59
Ну вот, теперь он точно не прочтет те разделы, незнание которых rised эти грабли к жизни. (Boooo!hybroid писал(а):оператор ~ возвращает результат с типом ... прямо на грабли.
- Сообщения: 26
- Зарегистрирован: Сб май 16, 2015 22:42:01
До того как написать в этот высокоинтеллектуальный форум делал так, не работает:
Так работает:
Код: Выделить всё
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
То есть, преобразовывали unsigned char в unsigned char же?AntonChip писал(а):~(unsigned char)ir_code[1] - так, не работает
До сего дня был уверен, что написать такое не под силу никому. "О, сколько нам открытий чудных...".
Все же прочтите хотя бы немного о языке Си, хотя бы те два раздела...
________________
- А на горизонте виднелся маааленький ...
- Большой!!!
- ... А на горизонте виднелся большой ... маааленький кораблик...
©
- Сообщения: 26
- Зарегистрирован: Сб май 16, 2015 22:42:01
А какое содержание еще может быть у слова "высокоинтеллектуальный"?Pnjom-Penb писал(а):Все же прочтите хотя бы немного о языке Си, хотя бы те два раздела...Может тогда простейшие истины перестанут казаться колдовством и слово "высокоинтеллектуальный" обретет свое первоначальное содержание...
- Сообщения: 26
- Зарегистрирован: Сб май 16, 2015 22:42:01
Pnjom-Penb, спасибо
Надеюсь, вопрос по makefile будет в тему...
Я очень начинающий WinAvr пользователь, поэтому, вероятно, спрошу глупость.
Объясните (или направьте - где можно почитать, беглый гуглопоиск не помог), что значат строчки в makefile:
OPT_DEFS += -DPS2_USE_USART
и
PS2_USE_USART = yes
И еще одно - я запускаю make из "консоли" (cmd). При работе он выводит ну очень много - полезной, как оказалось,- инфы. Как ее загнать в один файл - а то буфер не бесконечен и начальная часть теряется. В два файла (1>1.txt 2>2.txt) я научился, но ведь наверняка есть способ проще...
Я очень начинающий 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
Используется ли где-то в коде макрос PS2_USE_USART?
make > file.txt не работает?
make > file.txt не работает?
у меня сложилось впечатление, что это не макрос, а флаг...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
но при компиляции вылезла ошибка на первом же файле - "невозможно найти путь" или что-то подобное...
интернет говорит, что у make два потока вывода, то есть указанное мною вышеCOKPOWEHEU писал(а):make > file.txt не работает?
make >1.txt >2.txt
позволяет получить близкое к желаемому, но файла получается два и надо думать, что с чем взаимосвязано (по моменту вывода)
хотя, в общем, все понятно, конечно...
Что-то мне подсказывает что OPT_DEFS это список опций компилятора и выражение это добавляет к параметрам с которыми запустится компилятор определение PS2_USE_USART.
а строка "SRC += protocol/ps2_usart.c" добавляет к списку подключаемых исходников указанные файлы.
а строка "SRC += protocol/ps2_usart.c" добавляет к списку подключаемых исходников указанные файлы.
- Сообщения: 22
- Зарегистрирован: Сб дек 26, 2015 22:28:05
Уважаемые форумчане, я не так давно перешёл на си. При компиляции столкнулся с таким 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 как минимум один раз будет инициализирована.
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 как минимум один раз будет инициализирована.
благодаря аккуратности форматирования вашего кода невозможно понять, является ли X=5 единственным оператором блока if или нет. однако, при любом раскладе если условие if не будет выполнено, переменная X окажется не инициализированной.Andrey3885 писал(а):if(status&(1<<1)
X=5;
отслеживать содержимое глобальных переменных, и переменных, меняемых в других функциях, компилятор не может, поэтому не понимает, выполнится ли и когда именно ваше условие, потому на всякий случай предупреждает, что переменная может оказаться с непредсказуемым значением.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну и, более того, тут нет закрывающей скобки в условии if.
я о том и писал:WiseLord писал(а):Ну и, более того, тут нет закрывающей скобки в условии if.
т.к. много кода пропущено, нельзя понять, есть там что-то еще или нет, и было ли оно вообще...ARV писал(а):благодаря аккуратности форматирования вашего кода
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 22
- Зарегистрирован: Сб дек 26, 2015 22:28:05
Уважаемый ARV я начинающий, прошу Вас отнестись с пониманием, тепер по сути:
Знакомился с Си по книгам, так вот там по поводу фигурных скобок говорилось, что група оператороров должна быть взята в фигурные скобки, один оператор брать в фигурные скобки не обязательно. У меня в приведённом примере после if(True) выполняется один оператор.ARV писал(а):благодаря аккуратности форматирования вашего кода невозможно понять, является ли X=5 единственным оператором блока if или нет. однако, при любом раскладе если условие if не будет выполнено, переменная X окажется не инициализированной.
У меня в начале функции при объявлении переменной status, выполняется её инициализация начальным значением 0b10000010. В первой интерации в if проверяется установка бита 1 переменной status, который установлен при инициализации, и соответственно в 1 интерации X присваивается 5. В дальнейшем, X=5 может не выполниться, но как минимум один раз этот оператор выполнится, и X до использования будет инициализирован. Я хочу понять почему компилятор этого не видит.ARV писал(а):отслеживать содержимое глобальных переменных, и переменных, меняемых в других функциях, компилятор не может, поэтому не понимает, выполнится ли и когда именно ваше условие, потому на всякий случай предупреждает, что переменная может оказаться с непредсказуемым значением.
- Сообщения: 22
- Зарегистрирован: Сб дек 26, 2015 22:28:05
Извеняюсь, ошибся, я писал пример в редакторе ответов форумаWiseLord писал(а):Ну и, более того, тут нет закрывающей скобки в условии if.
Компилятор не настолько умный чтобы рассматривать все возможные ветви условий, тем более ваша переменная могла быть изменена где-то в коде по пути от инициализации до условия. Да и условие могло быть и посложнее.
Компиляторы такие ситуации не разруливают настолько глубоко, этим занимаются отдельные статические анализаторы кода.
Если хотите чтобы начальное значение Х было равно 5 то так и сделайте. Такая инициализация значением переменной X как у вас сомнительна в плане надёжности, хоть алгоритм и очевиден с первого взгляда. Но не всегда будет так.
Компиляторы такие ситуации не разруливают настолько глубоко, этим занимаются отдельные статические анализаторы кода.
Если хотите чтобы начальное значение Х было равно 5 то так и сделайте. Такая инициализация значением переменной X как у вас сомнительна в плане надёжности, хоть алгоритм и очевиден с первого взгляда. Но не всегда будет так.


