Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

вопрос для лучших умов сайта :))
помогите обмануть законы математики и решить уравнение
Х % 10 = 10
Tell Me The Truth
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Решение: корней уравнение не имеет.

Остаток от деления не может быть больше либо равен делителю.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

помогите пожалуйста найти логическую ошибку
вот код
http://dpaste.com/1N06BYY
это обычная индикация
на дисплее горит 012345
все работает на ура
вот только со временем я заметил что на тех пинах портов, а это В и Д, где НЕ подключен семисегментный индикатор, появляется всякий мусор
причиной этому является строки 55 и 56
я понял что надо налаживать маску
но после наложения маски, когда я комментирую строки 55 и 56 , а ввожу в действие 57, 58 все перестает работать
где я ошибаюсь
Tell Me The Truth
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

FreshMan писал(а): я понял что надо налаживать маску
но после наложения маски, когда я комментирую строки 55 и 56 , а ввожу в действие 57, 58 все перестает работать
где я ошибаюсь

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

PORTB = PORTB & ~mask_PB | (CodeDigit[Screen[var]] & mask_PB);
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

в чем состоит моя ошибка при написании тернарного оператора ?
Изображение
Tell Me The Truth
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Скобок нет.

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

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Это неправильно, потому что воспринимается как

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

time_format_12_AM_PM == (0 ? point[0] = 0 : point[0] = 1);
или же, учитывая, что 0 - это всегда 0, выходит

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

time_format_12_AM_PM == point[0] = 1;
а это ерунда какая-то
Либо так делать:

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

(time_format_12_AM_PM == 0) ? point[0] = 0 : point[0] = 1;
либо, красивее, так:

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

point[0] = (time_format_12_AM_PM == 0) ? 0 : 1;
Или, наоборот

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

point[0] = time_format_12_AM_PM ? 1 : 0;
А если time_format_12_AM_PM принимает только 0 и 1, то в конкретно этом случае хватит вообще

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

point[0] =  time_format_12_AM_PM;
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

WiseLord писал(а):

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

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Это неправильно, потому что воспринимается как

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

time_format_12_AM_PM == (0 ? point[0] = 0 : point[0] = 1);
У "? :" приоритет ниже чем у "==". По этому, Ваши рассуждения неверны.

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

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
будет восприниматься как

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

(time_format_12_AM_PM == 0) ? point[0] = 0 : point[0] = 1;
Вообще, судя по догадкам, что хотел этим кодом сделать автор, то лучше ему сделать такую запись :

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

point[0] = time_format_12_AM_PM != 0;
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

point[0] = time_format_12_AM_PM == 0 ? 0 : 1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение WiseLord »

Аlex писал(а):У "? :" приоритет ниже чем у "==". По этому, Ваши рассуждения неверны.

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

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
будет восприниматься как

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

(time_format_12_AM_PM == 0) ? point[0] = 0 : point[0] = 1;
Вы правы, полистал документацию - так и есть. Тогда, по идее, должно было бы скомпилироваться.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

FreshMan писал(а):в чем состоит моя ошибка при написании тернарного оператора ?
У операторов ?: и = одинаковый приоритет и правая ассоциативность. Результат операции присваивания - собственно присваиваемое значение. Вероятно случай компилятора-параноика, который хочет результат всей тернарной операции обязательно куда-то присунуть. Для проверки гипотезы попробуйте так:

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

point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Соберётся - параноик, не соберётся - в ассоциативности, стало быть запутался.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Автор, вероятнее всего, сам что-то намудрил и сидит теперь подглядывает за нами, стыдясь ответить сюда :))
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Аlex писал(а):Автор, вероятнее всего, сам что-то намудрил
за неимением опыта такое приходится мудрить что и стыдно потом становится за напрасно написанные строки :))
остановился на этом

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

point[0] = time_format_12_AM_PM; // выкл/вкл точки 0-го разряда для обозначения АМ/РМ
Tell Me The Truth
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

FreshMan писал(а):за неимением опыта такое приходится мудрить что и стыдно потом становится за напрасно написанные строки :))
Нет ничего постыдного в наработке опыта и оттачивании своего стиля кодирования. Наоборот - получайте удовольствие от возможности выразить свой замысел гораздо более компактно чем ещё вчера. А завтра лаконичнее чем сегодня. :)

Повторю просьбу - проверьте, пожалуйста, компилируется ли такой вариант:

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

point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Спасибо.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

Я проверил

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

volatile uint8_t x, y, z, res;

// x == 0 ? y = 0 : z = 1;
// res = x == 0 ? y = 0 : z = 1;
   res = x == 0 ? y : z;
первые две закомментированные строки не компилятся, третья скомпилировалась. Выходит присваивать там, при работе с этим компилятором, нельзя.

P.S. вот со скобками проглотило

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

x == 0 ? (y = 0) : (z = 1);
«И всё-таки она вертится!»
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Siarzhuk писал(а): Повторю просьбу - проверьте, пожалуйста, компилируется ли такой вариант:

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

point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
Спасибо.
нет, ошибка таже :)
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):ошибка таже
интересно... что же не так? чем выражение a=b отличается от (a=b)?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Сообщение Apparatchik »

тоже интересно, компилятор GCC для AVR версии 4.3.3 тоесть который с WinAVR устанавливается.

P.S. MinGW 4.8.1 ситуация не изменилась
«И всё-таки она вертится!»
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

ARV писал(а):что же не так?
А как вам понравится вот это: Renesas-овский e2 студень с KPIT-овским компилятором на базе какой-то гоцацы при сборке С-файла:

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

../src/params.c:623:65: error: lvalue required as left operand of assignment
  point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;
                                                                 ^
Обратите внимание куда кажет меточка на третьей строке. А теперь меняем расширение на .cpp и всё собирается. Наконец идём и сравниваем таблицы приоритетов для C и C++. :-D
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):А как вам понравится вот это
мне никогда не нравится то, что я не понимаю...

удивительно, но только на последний оператор присваивания компилятор ругается, и взятие этого оператора в скобки решает проблему... не понимаю - почему?! неужели компилятор берет за lvalue все, что левее последнего оператора = ???? :shock:
point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1; - ошибка
point[0] = time_format_12_AM_PM == 0 ? point[0] = 0 : (point[0] = 1); - ошибки нет

P.S. двоеточие, что ли, не является частью тернарного оператора, а рассматривается, как отдельный оператор с приоритетом, равным присваиванию?! :shock:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):мне никогда не нравится то, что я не понимаю...
ВСЕЦЕЛО СОЛИДАРЕН ! :))
Tell Me The Truth
Ответить

Вернуться в «Разные вопросы по МК»