Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Вт окт 31, 2017 15:15:11

Про что уже не так написал , что-то не понял.

как минимум, это должно выглядеть так

опять магические числа 66 и 0b0011111110010000
что такое mass? Давайте угадаю - "массив". Нет, нет и нет. Переменная должна называться осмысленно.

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

Вт окт 31, 2017 15:18:02

АА, ну насчет как выглядит тут вопрос не стоит, это уж как мне удобнее, интересны были мнения насчет самой логики написания, поправил код, появилось еще 2кб дополнительного пространства.
Странно, почему магические то? Ну не пишу я комментарии на очевидные для меня куски кода, просто мне так удобнее, а раз удобно значит привычно. Вот как-то так. Продолжаем обсуждение.

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

Вт окт 31, 2017 15:27:35

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

по поводу написания качественного кода исписано сотни книг, тысячи гигабайт форумов, а вам все мало, у вас, оказывается, своё понимание об удобстве... успехов вам на этом пути!

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

Вт окт 31, 2017 15:34:48

вам удобнее потому, что вы успели привыкнуть к этому говну. Распривыкайте обратно и учитесь делать правильно.
ra9ust писал(а):почему магические то?

потому, что никак не названы. И совершенно неважно, насколько их значение очевидно для того, кто в теме.

ну вот для примера. Все, кто использует modbus, знают коды функций, что там Read Holding registers это 03, Write single Holding register это 06 и далее. Вроде как разберутся в случае чего. Но использовать их прям вот так, как числа - крайне фиговая практика. Потому пишем:

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

Вт окт 31, 2017 15:58:15

Качественного в смысле самого исполнения кода, а не того что пробел не сделал или скобки не там поставил.Понятно всё с вами.

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

Вт окт 31, 2017 16:21:09

чтобы подсказать что-то по поводу "самого исполнения кода", надо сначала прочитать ваш код и понять, что он делает. И тут у нас проблема: вамвитььудобнаписатьигонитаккагпринято,и,раз,для,вас,все;ачивидна,высчетаетештоудобствочитающихниважна. Тут понимаете, какая штука: считаемые вами неважными пробелы, отступы, скобки, названия идентификаторов, структурирование кода вообще имеют такую же роль, как и правила орфографии, пунктуации и семантики естественного языка. Их же вы почему-то не игнорируете, так?

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

Вт окт 31, 2017 16:33:35

Качественного в смысле самого исполнения кода, а не того что пробел не сделал или скобки не там поставил.Понятно всё с вами.

А что Вам понятно? Все советы, рекомендации, критика, IMHO, были даны по существу. Напустите на самый идеальный код обфускатор, чтобы он заменил все имена переменных, функций, констант, на "отфонарные", а макроподстановок напротив, на прямое включение и что Вы получите? Программа продолжит выполняться точно-так-же, как и с осмысленными именами сущностей, но кто сможет такой код поддерживать, дополнять, изменять? Ваш код обфусцирован изначально. :) "Вопрос 'Как писать хорошие программы' из разряда 'Как писать хорошую английскую прозу'". Ч. Уэзрелл. Вы пока делаете это хреново. Как Вы будете делать это дальше - Ваше личное дело, вот только именно Вы предложили к рассмотрению свой код, а не те, кто вам здесь отвечал. Так-что пробелы, скобки должны быть ( ну или их хотя-бы рекомендуется ставить ) в нужное время, в нужном месте. Не нравятся вам общепринятые правила, так пишите, как Вам хочется, но имейте в виду, однажды с ростом программы ( а с таким подходом почти наверняка ) , у Вас неизбежно появятся трудноуловимые ошибки. Желающих исследовать ваши неряшливые портянки кода, найдётся немного желающих. Так-что умерьте гордыню и научитесь адекватно и вдумчиво воспринимать справедливую критику.

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

Вт окт 31, 2017 16:47:23

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

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

Вт окт 31, 2017 17:01:46

http://www.tutorialspoint.com/online_c_formatter.htm
Ваш последний код :
Код:
void contr_eep (void)
{   
for(comp=0;comp<66;comp++){
 if(mass[comp]!=eep_mass[comp])result=0;}
 if(result==1){delayt=0;while(delayt<200){lcd_gotoxy(0,0);lcd_putsf("  TEST EEPROM         OK!       ");}w=0;}else
{lcd_gotoxy(0,0);lcd_putsf("  TEST EEPROM       FAILURE!    ");if(eeppp&0b0011111110010000){PORTB.5=0;}else{PORTB.5=1;}if(PINC.3==0)
{PORTB.5=0;dreb_0=6;w=0;}}  //пищит каждые примерно 2 минуты
}

в два клика превращается вот в это чудо :
Код:
void contr_eep (void)
{
    for(comp=0; comp<66; comp++) {
        if(mass[comp]!=eep_mass[comp])result=0;
    }
    if(result==1) {
        delayt=0;
        while(delayt<200) {
            lcd_gotoxy(0,0);
            lcd_putsf("  TEST EEPROM         OK!       ");
        }
        w=0;
    }
    else
    {   lcd_gotoxy(0,0);
        lcd_putsf("  TEST EEPROM       FAILURE!    ");
        if(eeppp&0b0011111110010000) {
            PORTB.5=0;
        }
        else {
            PORTB.5=1;
        }
        if(PINC.3==0)
        {
            PORTB.5=0;    //пищит каждые примерно 2 минуты
            dreb_0=6;
            w=0;
        }
    }
}

Приятнее смотреть, не правда ли ?

Прогоняйте свой код, хотябы, через подобные сервисы, перед выкладыванием. И ни у кого не возникнет никаких вопросов и лишних слов :)

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

Вт окт 31, 2017 17:08:09

Точно работает! Не знал про такие сервисы, спасибо за подсказку!

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

Вт окт 31, 2017 17:10:14

Что касается кода. Я, например, с трудом представляю, что в этом коде делается.
Например, вот тут :
Код:
        delayt=0;
        while(delayt<200) {
            lcd_gotoxy(0,0);
            lcd_putsf("  TEST EEPROM         OK!       ");
        }
я вижу бесконечный цикл.

А этот код вообще бессмыселен :
Код:
    for(comp=0; comp<66; comp++) {
        if(mass[comp]!=eep_mass[comp])result=0;
    }
    if(result==1) {
        ....

:dont_know:

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

Вт окт 31, 2017 17:20:19

Ну как же так, в первом цикл не бесконечен, а длится 2 сек для отображения надписи епром ок и после этого возврат в главное меню(w=0).
Во втором сравниваются 65 переменных в озу с их значениями в епром, если успешно то пишется та самая надпись Ок на две сек, если хоть одно отличие то другая надпись и звуковое оповещение, всё работает, проверено.Это замена той вчерашней кошмарной записи где каждая переменная проверяется через if.

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

Вт окт 31, 2017 17:29:28

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

ra9ust писал(а):Во втором сравниваются 65 переменных в озу с их значениями в епром, если успешно то ..........
А представьте, что на начале цикла, переменная result будет равна нулю. Что произойдёт ?

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

Вт окт 31, 2017 17:36:01

delayt постоянно инкрементируется в 10мс прерывании.

result Не будет равна нулю, в самом начале , после инициализации портов и устройств, перед вечным циклом ей присваивается 1.

Добавлено after 2 minutes 27 seconds:
Хотя можно и в инверсии сделать, код сократится на одно присваивание.

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

Вт окт 31, 2017 17:40:08

ra9ust писал(а):result Не будет равна нулю, в самом начале , после инициализации портов и устройств, перед вечным циклом ей присваивается 1
а как же это:
Аlex писал(а):if(mass[comp]!=eep_mass[comp])result=0;
если данные не совпадут?

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

Вт окт 31, 2017 17:41:31

ra9ust писал(а):после инициализации портов и устройств, перед вечным циклом ей присваивается 1

1. Место её инициализации - прямо перед самым циклом, а не "где-то там...". Мало того, она должна быть локальной, ибо используется только в одном месте.
2. Функция проверки еепром должна содержать только код ля её проверки. Никаких дисплеев, пищалок, и т.д... там не должно быть.
3. ... Уххх, много чего можно ещё писать, руки устанут :)

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

Вт окт 31, 2017 17:41:41

и в течение 2 секунд каждые 10 мс выводить одно и то же на дисплей - это крутой подход, логичный вполне. не тупая же задержка...

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

Вт окт 31, 2017 17:42:34

Ну так и будет вывод соответствующей надписи else
{lcd_gotoxy(0,0);lcd_putsf(" TEST EEPROM FAILURE! ");

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

Вт окт 31, 2017 17:45:06

А что за слово такое "Failure" ? :)

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

Вт окт 31, 2017 17:51:26

Почему нежелательно инициализация где-то там и в чем минус того что она глобальная?
Почему никаких дисплеев и пищалок?

Добавлено after 2 minutes 24 seconds:
А что за слово такое "Failure" ? :)

К исполняемому коду это не имеет никакого отношения! :)

Добавлено after 1 minute 29 seconds:
и в течение 2 секунд каждые 10 мс выводить одно и то же на дисплей - это крутой подход, логичный вполне. не тупая же задержка...

Напишите как по другому...
Ответить