Страница 238 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср авг 10, 2016 22:45:02
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;
Походу туман рассеялся.

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 06:53:15
ARV
Siarzhuk писал(а):Походу туман рассеялся
я, наверное, тупой, но я пока в тумане: если приоритет операций равный, то выполняться они должны слева направо, не так ли? т.е. и в этом случае должна быть ошибка...
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 07:05:41
WiseLord
Не все слева направо.
= и
?: как раз
справа налево. Там ещё в Notes интересно про
?: написано, что не всякие компиляторы его приоритет одинаково обрабатывают.
Да уж, в таких ситуациях лучше всё же скобками пользоваться. А такие тонкости оставить для собеседований.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 07:42:28
ARV
я, конечно, прошу прощения, но привык иметь по всем вопросам свое мнение и вот никак не могу удержаться, чтобы в очередной раз его не высказать: какую траву надо было курить, чтобы сделать стандартом такую кучу противоречий?!

язык Си, имхо, типичный пример того, как не надо делать языки программирования! в язык намеренно введено огромное количество способов сделать одно и то же, но всякий раз с разными побочными эффектами, а чтобы эти эффекты как-то устаканить, введено огромное количество разных оговорочек... в итоге никакой логики в ее естественном понимании применить невозможно: только привыкнешь, что какое-то действо делается вот так вот, как обнаруживаешь, что почти такое же категорически нельзя делать аналогично! зачем все это?!
имхо, в очередной раз повторюсь: язык Си - это кафтан, сшитый
стальным тросом стандарта из кусочков всевозможных материй - от дерюги до тончайшего шелка. а все потому, что хотелось все и сразу...
WiseLord писал(а): в таких ситуациях лучше всё же скобками пользоваться
я, конечно, и тут с собственным пониманием снова вылезу.. имхо, единственное правило, которое логично помогает справиться с Си, заключается в том, что не надо даже знать про множество вариантов извращений, которые позволяет делать Си из кода, а следует придерживаться минимального набора возможностей (см. бритва Оккама). касательно тернарного оператора это выливается в то, что я говорил ранее: его назначение - возвращать одно из двух значений, поэтому использовать в нем операнды, для которых возврат значения является
побочным эффектом, не надо.
а про скобки согласен: в Си их много не бывает.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 08:43:36
Siarzhuk
ARV писал(а):в язык намеренно введено огромное количество способов сделать одно и то же, но всякий раз с разными побочными эффектами
Проблему вижу в том, что "колёсный пароход родом из середины XIX века" до сих пор используют в промышленных количествах как основное средство транспортировки. И если в физическом мире длительность существования объектов ограничена естественным устареванем, дряхлением и неизбежным распадом на базовые элементы, то в информационной среде "таких факторов не действует" и свойственная человеческому мозгу лень скорее оборудует каждую "пароконную повозку" спутниковой системой навигации чем рискнёт построить на этом месте совершенно новую инфраструктуру, заточенную под безопасность движения и автопилот.
И, как выразился один знакомый, -"участие в большом коллективном опен-сорц проекте с лихвой утоляет желание тратить время на игру в квесты."

Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 09:01:29
Siarzhuk
ARV писал(а):для которых возврат значения является побочным эффектом
Скорее проблема в его непривычном использовании в контексте тернарной операции. Ведь конструкции типа
совершенно о том-же, но видели мы их несравнимо чаще и в заблуждение ввести они нас не смогут.
Си ведь родом из 70-ых годов прошлого века - а мир вокруг него изменился чуть ли не полностью. Нужно, наверное, представлять то время, когда ресурсы были дороги и использовалась любая возможность их сэкономить за счёт конструкций множественного назначения. Другой вопрос, что дедушке пора на покой - тут я согласен.
ARV писал(а):а про скобки согласен: в Си их много не бывает.
Вы, верно, в душе не поэт.

Расписать замысел максимально лаконично - удовольствие сравнимое разве что с внезапно забредшим в голову четверостишием. Но, работая в коллективе, конечно-же нужно беречь чужое время, расставлять скобки и не умничать.
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 11:06:15
ARV
Siarzhuk писал(а):Вы, верно, в душе не поэт.
что верно, то верно.
Siarzhuk писал(а):Расписать замысел максимально лаконично - удовольствие сравнимое разве что с внезапно забредшим в голову четверостишием
такое ощущение, что программисты Си - все сплошь поэты, но при этом одновременно и поэтические критики, потому как каждый стремится
из любви к искусству написать такой
лаконичный код, который обязательно будет раскритикован в пух и прах другим поэтом, выдающим альтернативу
еще лаконичнее и непонятнее.
скажем, попадался мне пример кода, который (я уж не помню) какую-то полезную функцию решал... но выглядело это как
пустой цикл for, а вся полезная работа выполнялись внутри круглых скобок
for... кому такое четверостишие нужно? да, так можно, но нужно ли?!
Re: Вопросы по С/С++ (СИ)
Добавлено: Чт авг 11, 2016 11:59:25
Siarzhuk
ARV писал(а):такое ощущение, что программисты Си - все сплошь поэты, но при этом одновременно и поэтические критики, потому как каждый стремится
Так ведь стремление к доминированию - базовая потребность приматов. И никто с программистиков этой почётной обязанности не снимал. Выделяются чем могут [- если время после кодинга остается].
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс авг 14, 2016 15:59:49
FreshMan
допускается ли запись такого вида ?
Код: Выделить всё
OCR2A = level_br = brightness[ eeprom_read_byte(&cp_level_br) ];
этот кусок находится в инициал. таймера 2
OCR2A принимает значение cp_level_br, а вот level_br нет
в level_br записывается всякий мусор
как определить причину бага ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс авг 14, 2016 16:40:32
ARV
FreshMan писал(а):как определить причину бага ?
ARV писал(а):не надо даже знать про множество вариантов извращений, которые позволяет делать Си из кода, а следует придерживаться минимального набора возможностей (см. бритва Оккама)
запишите то, что вы желаете, самым простым и понятным способом. и делайте так всегда - вот мой совет.
Код: Выделить всё
level_br = brightness[ eeprom_read_byte(&cp_level_br) ];
OCR2A = level_br;
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс авг 14, 2016 17:28:39
FreshMan
спасибо !
при разложении многочлена на составляющие всплыла логическая ошибка

Re: Вопросы по С/С++ (СИ)
Добавлено: Вт авг 23, 2016 21:27:36
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
как в таком случае следует править знакогенератор ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 27, 2016 00:00:03
shads
FreshMan писал(а):к примеру, 6-ть сегментов висят на пинах 7-2 порта Д, остальные на пинах 1-0 порта В
А В С D E F G DP
7-6-5-4-3-2-1-0
мне надо сегмент Е перенести с 3 пина порта Д на 2 пин порта B
как в таком случае следует править знакогенератор ?
Знакогенератор вообще не нужно править, все решается настройками модуля, глянь как я сделал...
Можешь вешать линии дисплея вообще на любые порты и выводы контроллера, просто в дефайнах указываешь, какой вывод дисплея на каком порту и выводе контроллера...
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 07, 2016 08:06:50
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;}
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 07, 2016 08:16:55
Аlex
А что в ней хитрого ?

Просто берётся остаток от деления на 8.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 07, 2016 08:18:39
menzoda
Это типа аналог такой конструкции?
Да, но лучше использовать условие, потому что если MAX_SOCK_NUM не будет равен степени двойки, то операция остатка от деления % будет весьма прожорливой.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 07, 2016 09:20:02
pokk
А что в ней хитрого ?

Ну я думал что в ней скрыт ещё какой-то смысл типа приоритет вызова(Socket_Current=0 станет последним), до которого я ещё не додумался.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 07, 2016 10:04:12
WiseLord
pokk писал(а):Socket_Current=0 станет последним
Необязательно. Начальное значение Socket_Current ведь не задано нигде. С каким значением он войдёт в эту функцию, с таким и выйдет, прокрутившись в цикле 8 раз.
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн сен 12, 2016 20:07:36
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 получает нужное значение, т.е. все нормально проходит.
Что это?!
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн сен 12, 2016 20:54:06
WiseLord
Значит, i не равно 0. Потому и не проходит.