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

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

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

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

Добавлено: Чт авг 11, 2016 09:01:29
Siarzhuk
ARV писал(а):для которых возврат значения является побочным эффектом
Скорее проблема в его непривычном использовании в контексте тернарной операции. Ведь конструкции типа

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

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

Си ведь родом из 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. Потому и не проходит.