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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

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

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

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

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

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

Сообщение 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! ;-)
Аватара пользователя
smalcom
Встал на лапы
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

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

Сообщение smalcom »

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

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

Сообщение ra9ust »

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

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

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

Сообщение А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;
Дальше даже смотреть не стал. От комментарий воздержусь ... :)
Реклама
Аватара пользователя
ra9ust
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

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

Сообщение ra9ust »

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

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

Сообщение А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]
У Вас свалено всё в кучу и превратилось в кашу. В Вашем коде ориентироваться невозможно.

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

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

Сообщение ra9ust »

Понимаю. Тогда как сделать сравнение всех тех переменных находящихся в ОЗУ с их значениями в EEPROM ?

Добавлено after 2 minutes 10 seconds:
Согласен, в куче. Но я свободно ориентируюсь , возможно потому что сам составлял. По той же причине мне непонятен любой чужой код.Ну так как насчет сравнения переменных в епром?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

[uquote="ra9ust",url="/forum/viewtopic.php?p=3219974#p3219974"]как сделать сравнение всех тех переменных находящихся в ОЗУ с их значениями в EEPROM ?[/uquote] Структуры + побайтовое сравнение через указатель.
Аватара пользователя
ra9ust
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

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

Сообщение ra9ust »

А покажите это на примере,упрощенно?
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

код ну совсем ужасен, честно. Отмазка "я в нем разбираюсь" не принимается.
1) форматирование. Отступ - три или четыре пробела, а не один.
2) магические числа везде. Не должно такого быть, менять на константы или дефайны с осмысленными именами.
3) из названия функции должно быть понятно, что она делать. Вот что за temperature()?
4) откройте для себя switch
5) раз пишете сообщения и идентификаторы по английски и знаете его плохо, пользуйтесь переводчиком. Хотя бы для сообщений.
6) огромные цепочки условий в if-ах сокращаем и упрощаем. Думаем, как. В самом крайнем случае, если с ними вообще сделать ничего нельзя (что обычно не так) - выделяем скобками логически связанные блоки
7) не стесняемся использовать массивы и структуры вместо кучи переменных с индексами. Это к мешанине hour_al_1 и иже с ним.
8) избавляйтесь от кучи одинаковых функций, все отличие которых - разные переменные. Сему способствует пункт 7.
Аватара пользователя
ra9ust
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

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

Сообщение ra9ust »

Так, по магическим числам поясните,непонятно.
Чем свитч лучше чем иф?
Не понял про идентификаторы.
Но повторюсь, мне в нем всё понятно, но насчет уменьшения размера кода полностью согласен.

**избавляйтесь от кучи одинаковых функций, все отличие которых - разные переменные. Сему способствует пункт 7.** и с этим согласен, но подскажите как? На простом примере.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

[uquote="ra9ust",url="/forum/viewtopic.php?p=3219982#p3219982"]А покажите это на примере,упрощенно?[/uquote] Пример чего интересует ? Организацию структуры, или работу с указателем ?
Аватара пользователя
ra9ust
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

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

Сообщение ra9ust »

Ну например куча сравнений переменных с их значениями в еепром, как записать это компактней? Ну если конечно это приведет к уменьшению размера кода, а иначе нет смысла заморачиваться.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

ra9ust писал(а):куча сравнений переменных с их значениями в еепром, как записать это компактней?
Кучу переменных - никак. Объединяйте все переменные, логически связанные друг с другом, в структуры.
А две одинаковые структуры сравниваются элементарно - в цикле, через указатель, пробегаемся по всем байтикам и сравниваем их.

PS: Надеюсь, что такое структуры и указатели не нужно рассказывать ? Если что, всё гуглится без проблем.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="ra9ust",url="/forum/viewtopic.php?p=3220033#p3220033"]Так, по магическим числам поясните,непонятно.[/uquote]

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

...
if(cc>=254)cc=14;
...
if(w==72)w=60;
if(w==93)w=90; 
...
if(eeppp&0b0111111110010000)
...
lcd_putchar(0x42)
...
что такое 14? 72? 60? 93? 90? 0b0111111110010000? 0x42? Это и есть magic numbers - какие-то числа, что-то там означающие, но неизвестно что. Они все должны быть константами, дефайнами или энумами с осмысленными именами.
[uquote="ra9ust",url="/forum/viewtopic.php?p=3220033#p3220033"]Чем свитч лучше чем иф?[/uquote]
наглядностью в случаях выбора из множества возможных значений.
[uquote="ra9ust",url="/forum/viewtopic.php?p=3220033#p3220033"]Не понял про идентификаторы.[/uquote]
месиво из нормальный английских count, month, year, buzzer и транслита типа nochnik, lustra, opros сильно режет глаза.
[uquote="ra9ust",url="/forum/viewtopic.php?p=3220033#p3220033"]Но повторюсь, мне в нем всё понятно[/uquote]
тоже повторюсь - эта отмазка не принимается)

[uquote="ra9ust",url="/forum/viewtopic.php?p=3220033#p3220033"]**избавляйтесь от кучи одинаковых функций, все отличие которых - разные переменные. Сему способствует пункт 7.** и с этим согласен, но подскажите как? На простом примере.[/uquote]
вместо трешища

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

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
пишем чото типа

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

typedef struct {
	unsigned char day,
	unsigned char hour,
	unsigned char minute
} alarm_time_type;

alarm_time_type alarms[7];
и работаем дальше с массивом.
Аватара пользователя
ra9ust
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Чт июн 24, 2010 20:58:59

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

Сообщение ra9ust »

А вот вместо трешища короткая запись, это спасибо, примем к сведению. Ну а транслит и всё такое это просто на скорую руку, а потом так и осталось. А код правда мне понятен, ну видимо у кажного свое восприятие/написание.
Аватара пользователя
smalcom
Встал на лапы
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

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

Сообщение smalcom »

[uquote="ra9ust",url="/forum/viewtopic.php?p=3219963#p3219963"]Ну хорошо, наверняка здесь есть хорошо владеющие СИ, вот прокомментируйте сей код, насколько он кошмарный/некошмарный, само устройство на нем работает как я и задумывал, но может как-то можно код сократить/улучшить без потери функциональности? Если кому понадобится могу скинуть весь проект+схема в протеусе. Кто что скажет?[/uquote]
Мне сегодня сказали, что в четверг будет конец света - что-то там связанное с Юпитером и Венерой. Я не очень поверил поначалу, но теперь всё понял: не качайте архив!!!
Аватара пользователя
shindax
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

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

Сообщение shindax »

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

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

...
 if(sec>=60){min++;sec=0;}
 if(min>=60){hour++;min=0;tic=1;}
 if(hour==23&&min==59&&sec==50){if(cor>0)sec+=cor;} 
 if(hour==23&&min==59&&sec==59&&cc>11){if(cor<0)sec-=(128-(cor&0b01111111));cc=0;}
 if(hour>=24){day++;hour=0;week++;mint=0;maxt=0;eep_day=day;eep_month=month;eep_week=week;eep_year=year;}
 ...
Я-бы написал:

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

if(sec>=60)
 {
    min++;
    sec=0;
    if(min>=60)
    {
      hour++;
      min=0;
      tic=1;
 
       if(hour >= 24)
      {
        day ++;
        hour = 0;
        week ++;
        mint = 0;
        maxt = 0;
        eep_day = day;
        eep_month = month;
        eep_week = week;
        eep_year = year;
      }
    }
 
 }
 
 if( hour == 23 && min == 59 )
 {
  if( sec == 50 )
    if( cor > 0 )
      sec+=cor;
 
  if( sec == 59 && cc > 11 )
      {
        if(cor<0)
          sec-=(128-(cor&0b01111111));
        cc=0;
      }
  }
В целом, я-бы всё совсем по-другому написал. :) Код, это просто п...ц, согласен с вышенаприведенными резюме. :) Мне вот этого ( в одном месте функции, мля!!! )

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

...
 tal++;
 tr++;
 a++;
 b++;
 tpirr++;
 tpirrr++;
...
тоже хватило, чтобы остающуюся часть "нетленки" уже не читать, тут уже явно с логикой проблемы. В програмиировании на Си подобная "штыковая атака" не прокатит, вы саму методологию игнорируете. Оно, возможно, даже будет работать, но я сочувствую человеку ( вы вполне можете оказаться этим человеком через полгода ), которому понадобится что-то исправить/дописать.
Ответить

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