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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Const14 писал(а):я вообще проблемы не вижу и не могу понять, в чём Вы её видите
аналогично :) весь сыр-бор из-за жалкого jmp, которого иногда может и не быть :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение WiseLord »

Немножко странный код в том смысле, что коль скоро глобальная переменная b изменяется в каждой функции, так что на входы второй и третьей приходят уже разные данные.

Да и первая функция считает чуть по-другому, чем вторая и третья
Контактная информация:
Реклама
Родился
Сообщения: 18
Зарегистрирован: Чт авг 06, 2015 09:38:22
Откуда: Москва

Сообщение Const14 »

Код не имеет какого-либо практичского назначения, не ищите в нём смысл, вызовы функций f1, f2, f3 формальны. Немного поправил, чтобы уж совсем странно не выглядело.
Первая функция иллюстрирует цикл do ... while() и генерируемый для него код. Ещё раз повторю, что использовать его можно только в том случае, если тело цикла должно выполниться хотя-бы один раз!
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

на целых 2 байта хуже показал себя цикл while
Дык я об этом и сказал: do..while всегда быстрее или такой же как и while(). В простых циклах, когда компилятору удаётся превратить while() в do {} while, то разницы не будет.
Если подумать головой и посмотреть на код, то должно стать понятно и так, что while() медленнее.
весь сыр-бор из-за жалкого jmp, которого иногда может и не быть
да-да-да. А потом удивляемся кто же пишет всё гавённое тормозящее ПО.
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Спасибо всем за исчерпывающую дискуссию. Есть вопрос о порядке/приоритетности анализа условий. Допустим есть код:

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

if ((mode == ALARM_ACTIVE) || (mode == ALARM_COMPL))
{
     // do something
}
И событие ALARM_ACTIVE всегда предшествует ALARM_COMPL (так построена логика + состояние устанавливаеться 2 источниками ALARM_ACTIVE, а переход к следующему идет только 1, так что само состояние ALARM_COMPL вроде как встречаеться реже). Правильно ли я понимаю, что в таком случае целесообразнее их поменять местами, потому что компилятор "читает" условия справа-налево, и таким образом немного ускорить обработку этого условия ?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

ЕМНИП, вообще-то слева направо.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3218828#p3218828"]Есть вопрос о порядке/приоритетности анализа условий.[/uquote]
Есть таблица приоритетов и ассоциативности операторов - снимает напрочь все подобные вопросы, ознакомьтесь - не пожалеете! ;-)
[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3218828#p3218828"]Допустим есть код:

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

if ((mode == ALARM_ACTIVE) || (mode == ALARM_COMPL))
{
     // do something
}
[/uquote]
Внутренние скобки - лишние, поскольку приоритет оператора == равен 7 а у оператора || равен 12. Таблицу приоритетов можно распечатать и заламинировать - чтобы она всегда была перед глазами, а код был чистый и аккуратный.
[uquote="Пока_без_кота",url="/forum/viewtopic.php?p=3218828#p3218828"]И событие ALARM_ACTIVE всегда предшествует ALARM_COMPL (так построена логика + состояние устанавливаеться 2 источниками ALARM_ACTIVE, а переход к следующему идет только 1, так что само состояние ALARM_COMPL вроде как встречаеться реже). Правильно ли я понимаю, что в таком случае целесообразнее их поменять местами, потому что компилятор "читает" условия справа-налево, и таким образом немного ускорить обработку этого условия ?[/uquote]
Кто про что - а я вновь про таблицу приоритетов :) - ассоциативность у обоих используемых операторов "слева-направо". Так что событие ALARM_COMPL будет проверяться только если не произошло ALARM_ACTIVE а не наоборот, как вам нашёптывают "бесы целесообразности".
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Спасибо, уже читаю :write:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Блин.. А я уже поудалял :)))
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Пока_без_кота писал(а):А я уже поудалял
Ну и напрасно. Не стоит идти против своего удобства, всего-лишь по какому-то совету с форума. Тут дело лично каждого. А компилятору - пофиг.
Я, например, тоже придерживаюсь принципа "скобки лишними не бывают". Во-первых, что самое главное, исключены ошибочные записи. Мы пишем так, как выражение лежит у нас в голове. Во-вторых, улучшается читабельность кода.
Ну а какие плюсы, кроме минусов, от отсутствия "лишних" скобок - мне неведомо :dont_know:
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

Внутренние скобки - лишние, поскольку приоритет оператора == равен 7 а у оператора || равен 12.
Машинный код для машины, исходный - для человека. Поддерживаю предыдущих ораторов в принципе - скобок много не бывает. Автор или другой человек может читать исходный код и забыть о приоритетах, при беглом осмотре это тоже будет притормаживать внимание; разработчики ныне знают более одного языка программирования, вместо кучи памяток о приоритетах можно просто взять и поставить скобки; программирование => математика и эстетичнее выглядит заключённое в скобке выражение - тешит внутреннего перфекциониста.

Как говорили: для C/C++ определён порядок слева-направо и перестановкой действительно можно добиться ускорения программы для частых условий.
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Аlex писал(а): Ну а какие плюсы, кроме минусов, от отсутствия "лишних" скобок - мне неведомо :dont_know:
Ну как же - ускоряется работа компилятора (на несколько μs) :))
Изображение
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Ну разве что :))
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="smalcom",url="/forum/viewtopic.php?p=3219212#p3219212"]Автор или другой человек может читать исходный код и забыть о приоритетах, при беглом осмотре это тоже будет притормаживать внимание;[/uquote]
В проектировании пользовательских интерфейсов есть понятие "визуального мусора" - т.е. элементов не несуших никакой функциональной нагрузки, но отбирающих ресурсы зрительной системы пользователя. Для "бреющихся бритвой Оккама"© сиречь перфекционистов "ненужные" скобки и есть такой мусор. ;-) [/IMHO]
Но упёртость как little endians так и big endians в своей правоте непробиваема, посему любой более-менее серьёзный проект начинается с формулировки codestyle guidelines - где и прописывается где какие скобки и как ставятся. Чтобы облегчить "беглый просмотр" для всех участников, ага. :)

[uquote="smalcom",url="/forum/viewtopic.php?p=3219212#p3219212"]Как говорили: для C/C++ определён порядок слева-направо[/uquote]
Если вы про ассоциативность операторов - то это не всегда так. Далеко не всегда - 44% С и 46% С++ операторов право-ассоциативны.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

Спасибо, что открыли мне глаза. Вот теперь я счастлив.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

Сообщение ra9ust »

Ну хорошо, наверняка здесь есть хорошо владеющие СИ, вот прокомментируйте сей код, насколько он кошмарный/некошмарный, само устройство на нем работает как я и задумывал, но может как-то можно код сократить/улучшить без потери функциональности? Если кому понадобится могу скинуть весь проект+схема в протеусе. Кто что скажет?

Добавлено after 3 minutes 51 second:
Обновил сообщение.
Вложения
1235.txt
(74.5 КБ) 304 скачивания
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Глянул только на начало :
Спойлер

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


typedef unsigned char byte;
unsigned char buffer[32];
bit blink,startindk,startindt,pirkor,indik,start_back,start_rele,start_mic,start_pirkor,
start_pirtua,start_gerkon_1,start_gerkon_2,ind_mic,start_ohtik,start_nochnik,start_tt,spark,
t_end,tic,start_timer,t_flag,lustra_on,rele_1,rele_2,rele_3,rele_4,ee,ff,
start_test,t_flag_2,t_end_2,sw_temp;

unsigned char sec,min,hour,day,week,month,year;
unsigned char w,a,b,cc,dreb_0,dreb_1,opros,delayt,ik,alb,alarm_b,alarm_a,bl,ab,ttt,
ind,tpirr,tpirrr,pirkorr,pir_kor,pir_tua,gerkon_1,gerkon_1_ncno,gerkon_2,gerkon_2_ncno,
mic,en_tic_kor,en_tic_tua,counter,test_del,sp,ind_mic_t,start_timer_2,start_tt_2,timer_2,tvvv_2,
en_al,en_al_2,cou,test_count,secur,mode,swit,nag,en_nochnik,time_ohr,aaaa,bbbb,cccc,dddd,eeee,
vb,vvv,shkaf,en_lustra,alarm_r,r,tr,port_1,port_2,port_3,port_4,
tvvv,en_tic_hour,enprom,buzzer,rem_mem,opros_akk,func_count,f_1,start_func,
tpirk,tpirt,delay_kor,timrem,phone,kor_from,kor_to,al,tal,al_0,day_al,day_1_al,
day_2_al,day_3_al,day_4_al,day_5_al,day_6_al,day_7_al,hour_al,min_al,hour_al_1,
hour_al_2,hour_al_3,hour_al_4,hour_al_5,hour_al_6,hour_al_7,min_al_1,min_al_2,
min_al_3,min_al_4,min_al_5,min_al_6,min_al_7,hour_nag_start,min_nag_start,hour_nag_fin,min_nag_fin,
day_nag_start,month_nag_start,year_nag_start,day_nag_fin,month_nag_fin,year_nag_fin,
hour_rem_1,min_rem_1,day_rem_1,month_rem_1,year_rem_1,al_rem_1;

signed char back,countdown,cor,correct,timer_count,tt,tt_2,timer_count_2; 

unsigned int temp,temper,mint,maxt,bc,dreb_2,dreb_3,rele,count_mic,count_pirkor,
count_pirtua,count_gerkon_1,ohtik,count_gerkon_2,vc,volt,volter,tnochnik,ttimer,t_count,
end_tt,ttimer_2,t_count_2,end_tt_2,copy_temp,tshkaf,qq,yy,rr,mem,eeppp,func; 

eeprom unsigned char eep_day,eep_month,eep_year,eep_week;
eeprom unsigned char eep_pir_kor,eep_pir_tua,eep_gerkon_1,eep_gerkon_1_ncno,eep_mic,eep_gerkon_2,
eep_gerkon_2_ncno,eep_tpirk,eep_tpirt,eep_delay_kor,eep_timrem,eep_en_tic_kor,eep_en_tic_tua,
eep_kor_from,eep_en_nochnik,eep_en_lustra,eep_time_ohr,eep_shkaf,
eep_kor_to,eep_buzzer,eep_phone,eep_enprom,eep_nag,eep_en_tic_hour,eep_al,eep_day_1_al,eep_day_2_al,
eep_day_3_al,eep_day_4_al,eep_day_5_al,eep_day_6_al,eep_day_7_al,eep_min_al_1,eep_hour_al_1,
eep_min_al_2,eep_hour_al_2,eep_min_al_3,eep_hour_al_3,eep_min_al_4,eep_hour_al_4,eep_min_al_5,
eep_hour_al_5,eep_min_al_6,eep_hour_al_6,eep_min_al_7,eep_hour_al_7,eep_min_nag_start,
eep_hour_nag_start,eep_min_nag_fin,eep_hour_nag_fin,eep_day_nag_start,eep_month_nag_start,
eep_year_nag_start,eep_day_nag_fin,eep_month_nag_fin,eep_year_nag_fin,eep_hour_rem_1,eep_min_rem_1,
eep_day_rem_1,eep_month_rem_1,eep_year_rem_1,eep_al_rem_1;

eeprom signed char eep_cor;
eeprom unsigned int eep_count_mic,eep_count_pirkor,eep_count_pirtua,eep_count_gerkon_1,
eep_count_gerkon_2;
Дальше даже смотреть не стал. От комментарий воздержусь ... :)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

Сообщение ra9ust »

Так вот мне и нужны как раз комментарии! Просто нужно мнение.
Что там не так ? Слишком запутанно, как мне кажется?
Последний раз редактировалось ra9ust Пн окт 30, 2017 13:59:46, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

А вот это :
Спойлер

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

if(  
day==eep_day&&week==eep_week&&month==eep_month&&year==eep_year&&
min_al_1==eep_min_al_1&&hour_al_1==eep_hour_al_1&&min_al_2==eep_min_al_2&&hour_al_2==eep_hour_al_2&&
min_al_3==eep_min_al_3&&hour_al_3==eep_hour_al_3&&min_al_4==eep_min_al_4&&hour_al_4==eep_hour_al_4&&
min_al_5==eep_min_al_5&&hour_al_5==eep_hour_al_5&&min_al_6==eep_min_al_6&&hour_al_6==eep_hour_al_6&&
min_al_7==eep_min_al_7&&hour_al_7==eep_hour_al_7&&al==eep_al&&day_1_al==eep_day_1_al&&
day_2_al==eep_day_2_al&&day_3_al==eep_day_3_al&&day_4_al==eep_day_4_al&&day_5_al==eep_day_5_al&&
day_6_al==eep_day_6_al&&day_7_al==eep_day_7_al&&cor==eep_cor&&gerkon_2==eep_gerkon_2&&
pir_tua==eep_pir_tua&&mic==eep_mic&&gerkon_1==eep_gerkon_1&&gerkon_1_ncno==eep_gerkon_1_ncno&&
gerkon_2_ncno==eep_gerkon_2_ncno&&pir_kor==eep_pir_kor&&tpirk==eep_tpirk&&tpirt==eep_tpirt&&
delay_kor==eep_delay_kor&&timrem==eep_timrem&&buzzer==eep_buzzer&&phone==eep_phone&&
kor_from==eep_kor_from&&kor_to==eep_kor_to&&en_tic_hour==eep_en_tic_hour&&
en_tic_kor==eep_en_tic_kor&&en_tic_tua==eep_en_tic_tua&&en_nochnik==eep_en_nochnik&&
en_lustra==eep_en_lustra&&time_ohr==eep_time_ohr&&shkaf==eep_shkaf&&enprom==eep_enprom&&
nag==eep_nag&&hour_nag_start==eep_hour_nag_start&&min_nag_start==eep_min_nag_start&&
hour_nag_fin==eep_hour_nag_fin&&min_nag_fin==eep_min_nag_fin&&
day_nag_start==eep_day_nag_start&&month_nag_start==eep_month_nag_start&&
year_nag_start==eep_year_nag_start&&day_nag_fin==eep_day_nag_fin&&
month_nag_fin==eep_month_nag_fin&&year_nag_fin==eep_year_nag_fin&&hour_rem_1==eep_hour_rem_1&&
min_rem_1==eep_min_rem_1&&day_rem_1==eep_day_rem_1&&month_rem_1==eep_month_rem_1&&  
year_rem_1==eep_year_rem_1&&al_rem_1==eep_al_rem_1)
{
Вообще, шедевр :)))

Добавлено after 1 minute 17 seconds:
[uquote="ra9ust",url="/forum/viewtopic.php?p=3219971#p3219971"]Так вот мне и нужны как раз комментарии! Просто нужно мнение.[/uquote]
У Вас свалено всё в кучу и превратилось в кашу. В Вашем коде ориентироваться невозможно.

Вам знакомо слово "модульность" ?
Ответить

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