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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

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


В C тернарная операция имеет приоритет выше чем присваивание и компилятор парсит её так:

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;

результат чего не является lvalue - следовательно имеем ошибку при попытке присвоить ему 1.

В C++ приоритет у обоих одинаковый и тернарная исчисляется полностью:

time_format_12_AM_PM == 0 ? point[0] = 0 : point[0] = 1;

Походу туман рассеялся. ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

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

Сообщение WiseLord »

Не все слева направо. = и ?: как раз справа налево. Там ещё в Notes интересно про ?: написано, что не всякие компиляторы его приоритет одинаково обрабатывают.

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

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

ARV писал(а):в язык намеренно введено огромное количество способов сделать одно и то же, но всякий раз с разными побочными эффектами

Проблему вижу в том, что "колёсный пароход родом из середины XIX века" до сих пор используют в промышленных количествах как основное средство транспортировки. И если в физическом мире длительность существования объектов ограничена естественным устареванем, дряхлением и неизбежным распадом на базовые элементы, то в информационной среде "таких факторов не действует" и свойственная человеческому мозгу лень скорее оборудует каждую "пароконную повозку" спутниковой системой навигации чем рискнёт построить на этом месте совершенно новую инфраструктуру, заточенную под безопасность движения и автопилот.
И, как выразился один знакомый, -"участие в большом коллективном опен-сорц проекте с лихвой утоляет желание тратить время на игру в квесты." ;)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

ARV писал(а):для которых возврат значения является побочным эффектом

Скорее проблема в его непривычном использовании в контексте тернарной операции. Ведь конструкции типа

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

a = b = c = 3;

совершенно о том-же, но видели мы их несравнимо чаще и в заблуждение ввести они нас не смогут.

Си ведь родом из 70-ых годов прошлого века - а мир вокруг него изменился чуть ли не полностью. Нужно, наверное, представлять то время, когда ресурсы были дороги и использовалась любая возможность их сэкономить за счёт конструкций множественного назначения. Другой вопрос, что дедушке пора на покой - тут я согласен.

ARV писал(а):а про скобки согласен: в Си их много не бывает.

Вы, верно, в душе не поэт. ;) Расписать замысел максимально лаконично - удовольствие сравнимое разве что с внезапно забредшим в голову четверостишием. Но, работая в коллективе, конечно-же нужно беречь чужое время, расставлять скобки и не умничать.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Siarzhuk писал(а):Вы, верно, в душе не поэт.
что верно, то верно.
Siarzhuk писал(а):Расписать замысел максимально лаконично - удовольствие сравнимое разве что с внезапно забредшим в голову четверостишием
такое ощущение, что программисты Си - все сплошь поэты, но при этом одновременно и поэтические критики, потому как каждый стремится из любви к искусству написать такой лаконичный код, который обязательно будет раскритикован в пух и прах другим поэтом, выдающим альтернативу еще лаконичнее и непонятнее.

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

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

ARV писал(а):такое ощущение, что программисты Си - все сплошь поэты, но при этом одновременно и поэтические критики, потому как каждый стремится

Так ведь стремление к доминированию - базовая потребность приматов. И никто с программистиков этой почётной обязанности не снимал. Выделяются чем могут [- если время после кодинга остается].
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

допускается ли запись такого вида ?

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

OCR2A  = level_br = brightness[ eeprom_read_byte(&cp_level_br) ];

этот кусок находится в инициал. таймера 2
OCR2A принимает значение cp_level_br, а вот level_br нет
в level_br записывается всякий мусор
как определить причину бага ?
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

FreshMan писал(а):как определить причину бага ?
ARV писал(а):не надо даже знать про множество вариантов извращений, которые позволяет делать Си из кода, а следует придерживаться минимального набора возможностей (см. бритва Оккама)
запишите то, что вы желаете, самым простым и понятным способом. и делайте так всегда - вот мой совет.

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

level_br = brightness[ eeprom_read_byte(&cp_level_br) ];
OCR2A = level_br;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение FreshMan »

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

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

Сообщение FreshMan »

подскажите как правильно организовать кодовый генератор для семисегментных индикаторов
я сделал так

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

//                                                                               |--> потушить разряд
//                             0     1   2    3    4    5    6    7    8    9    |    *    C    -    F  D1-D4 D3,D4 Р    У    А    E    r    D3
const uint8_t CodeDigit[] = { 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00,0xC6,0x9C,0x02,0x8E,0x1E,0x06,0xCE,0x76,0xEE,0x9E,0x0A,0x04 };

вывод цифры организован следующим образом

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

PORTB |= ( ( CodeDigit[ Screen[var] ] ) & mask_PB );
PORTD |= ( ( CodeDigit[ Screen[var] ] ) & mask_PD );

тоесть, к примеру, 6-ть сегментов висят на пинах 7-2 порта Д, остальные на пинах 1-0 порта В
А В С D E F G DP
7-6-5-4-3-2-1-0
мне надо сегмент Е перенести с 3 пина порта Д на 2 пин порта B
как в таком случае следует править знакогенератор ?
Tell Me The Truth
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

FreshMan писал(а):к примеру, 6-ть сегментов висят на пинах 7-2 порта Д, остальные на пинах 1-0 порта В
А В С D E F G DP
7-6-5-4-3-2-1-0
мне надо сегмент Е перенести с 3 пина порта Д на 2 пин порта B
как в таком случае следует править знакогенератор ?
Знакогенератор вообще не нужно править, все решается настройками модуля, глянь как я сделал...
Можешь вешать линии дисплея вообще на любые порты и выводы контроллера, просто в дефайнах указываешь, какой вывод дисплея на каком порту и выводе контроллера...
Вложения
7seg_led.7z
(2.28 КБ) 198 скачиваний
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

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

#define MAX_SOCK_NUM 8

   for(i = 0; i < MAX_SOCK_NUM; i++)
   {
      Socket_Current = (Socket_Current + 1) % MAX_SOCK_NUM;
      if(Socket_CallBack[Socket_Current])
      {
         Socket[Socket_Current].Param.Event.Request = 1;
         Socket_CallBack[Socket_Current](&Header, RBuffer, &Socket[Socket_Current].Param);
         Socket[Socket_Current].Param.Event.Request = 0;
      }
   }

Подскажите что за хитрая конструкция Socket_Current = (Socket_Current + 1) % MAX_SOCK_NUM; тут используется.
Это типа аналог такой конструкции?

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

Socket_Current++;
if(Socket_Current>=MAX_SOCK_NUM){Socket_Current=0;}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

А что в ней хитрого ? :)
Просто берётся остаток от деления на 8.
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

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

Сообщение menzoda »

Это типа аналог такой конструкции?

Да, но лучше использовать условие, потому что если MAX_SOCK_NUM не будет равен степени двойки, то операция остатка от деления % будет весьма прожорливой.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

А что в ней хитрого ? :)

Ну я думал что в ней скрыт ещё какой-то смысл типа приоритет вызова(Socket_Current=0 станет последним), до которого я ещё не додумался.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

pokk писал(а):Socket_Current=0 станет последним
Необязательно. Начальное значение Socket_Current ведь не задано нигде. С каким значением он войдёт в эту функцию, с таким и выйдет, прокрутившись в цикле 8 раз.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

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

Сообщение Zhuk72 »

Всем привет!

У меня вопрос настолько смешной, что даже стыдно спрашивать. Однако я в недоумении.
Есть такое выражение:

if ((row < 2) && ((digit == i) || (digit == i + 1))) val = 0x10;

i принимает только значения 0 и 2, но это неважно. Пока рассматриваю только 0.
digit может быть 0...3. Но и это неважно. Оно инкрементируется по кругу. Для начала меня интерусуют 0 и 1.
Все переменные имеют одинаковый тип - unsigned char.

Так вот при указанном выше написании и совпадении всех проверок программа это место обходит. Но если я пишу

if ((row < 2) && ((digit == 0) || (digit == 1))) val = 0x10;

то val получает нужное значение, т.е. все нормально проходит.
Что это?!
Каждый имеет право на свое личное ошибочное мнение.

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

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

Сообщение WiseLord »

Значит, i не равно 0. Потому и не проходит.
Ответить

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