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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Billi34, это не скомпилиться. Лексема else применятся только с if, но уж никак не с while.
Реклама
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

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

Сообщение Billi34 »

Понял ошибку. Суть от этого не меняется. Перефразирую: МК перейдет к этой строке в которой написан оператор else.


Поправил в предидущем посте.
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Billi34 писал(а): По превышению i более 18 МК переходит в mesto_1. сбрасевает t в ноль.
Не так. Если i не меньше 18, то сначала t сбрасывается в 0, а затем управление передается на метку mesto_1. А вот где эта метка - мне не ведомо. Внутри цикла ее нет, значит она где-то за пределами цикла и поэтому происходит выход из цикла.
Billi34 писал(а):В случае возникновения ПИН В1 лог. единицы при значениях i меньше 18 МК переходит к оператору else
Опять не так. В случае, если любое из трех логических выражений в while окажется ложным, произойдет выход из цикла и вполнение "следующая строка кода". То есть, выход из цикла произойдет ИЛИ если PIND.B1=0 ИЛИ если i>=20 ИЛИ если t=0
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

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

Сообщение Billi34 »

Не меньше значит больше? По сути если i равно 10 МК переходит к строке: Delay 100; i++; и далее снова к while?

Добавлено after 2 minutes 14 seconds:
Разумеется mesto_1 расположено выше по тексту кода и МК благополучно туда "выпрыгивает" только условия не выполняются.
Или криво выполняются.

Добавлено after 7 minutes 48 seconds:
Опять не так. В случае, если любое из трех логических выражений в while окажется ложным, произойдет выход из цикла и вполнение "следующая строка кода". То есть, выход из цикла произойдет ИЛИ если PIND.B1=0 ИЛИ если i>=20 ИЛИ если t=0

А вот здесь пожалуйста по подробней: PIND.B1=0 или 1 ?

Добавлено after 3 minutes 16 seconds:
t не меняется по условиям цикла. Только для выхода. i "считается" 2 сек. Остаётся только ПИН В1 и мне надо чтоб с приходом 1 МК перешел к "следующая строка кода"

Добавлено after 2 minutes 26 seconds:
Не так он(код) работает в железе. И с приходом 0 и 1 МК перепрыгивает на mesto_1
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Billi34, дорогой, переходи на светлую сторону. Не надо придумывать алгоритмы, которые не понимает как работает даже автор. Во-первых, забудь оператор goto. Поверь, это не больно. Во-вторых, оформляй функционально законченные фрагменты в виде функций с локализацией всех необходимых для её работы данных/переменных внутри. В-третьих, делай простые циклы с понятными условиями их окончания. Простой и понятный код с большей вероятностью работает правильно. Поднаберёшься опыту - будешь применять продвинутые техники, благо в С, а там глядишь и С++ есть куда двигаться.
Реклама
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

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

Сообщение Billi34 »

Ну почему же не понимаю, все очень даже понимаю. И по строкам разложил. А без goto как выскочить из цикла? И в начало цепочки событий?
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

А не надо никуда "выскакивать". Перестрой алгоритм по другому. Вот у тебя есть "цепочка событий". Сколько раз она должна выполниться? Напиши цикл который выполняет эту цепочку событий нужное количество раз. А потом будешь внутри цикла писать саму "цепочку".
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Billi34, приведите весь код, тогда покажу, как можно сделать без goto. Только вставляйте его, как Code (кнопочка такая), а не прямо в текст сообщения.
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

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

Сообщение Billi34 »

В том то и дело что цепочка тактируется PINB и длинна цепочки событий может быть разной. Я уже думал так сделать, как Вы предложили Не разрешимые дилеммы не дали хода. Недостаток знаний.
Последний раз редактировалось Billi34 Пт сен 06, 2019 17:32:54, всего редактировалось 1 раз.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Billi34, не бывает неразрешимых проблем. Приведите весь код, пожалуйства.
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

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

Сообщение Billi34 »

о.к.
Вложения
Новый текстовый документ.txt
(2.7 КБ) 162 скачивания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

VladislavS писал(а):забудь оператор goto. Поверь, это не больно
вот со всем сказанным в этом же сообщении соглашусь, а с процитированным - не могу. лично мне было довольно "больно" без goto решить самую простую задачу анализа символов в строке, если при обнаружении некоторых надо закончить анализ, а для остальных просто выполнить простейшие манипуляции с ними и другими данными.

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

while(ch = *s++){
   switch(ch){
   case 'A' : goto m1;
   case 'D' : s[-1] = 'd'; break;
   default:
      continue;
   }
}
m1:
   //
сильно упрощенный код. на самом деле там в switch-е в одной из веток тоже был цикл... и тоже с вариантом досрочного прерывания как switch, так и while

я не говорю, что это нельзя сделать без goto, я говорю, что лично я это готов сделать либо из чисто спортивного интереса, либо не готов вообще - добавление новых переменных, дробление кода на функции и т.п. "методы" избегания goto слишком болезненны для меня, потому как я очень ленивый...

кстати, смотрел исходники avr-libc... там goto очень много... видимо, не один я ленивый :)))

Добавлено after 3 minutes 9 seconds:
то есть я хочу сказать, что в тех местах, где не помогает break, обойтись без goto представлет проблему.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3695704#p3695704"]слишком болезненны для меня[/uquote]От жеж...

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

while( *s && (*s!='A'))
{
   switch(*s)
   {   
     case 'D' : *s = 'd'; break;
     default:
   }
   s++;
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

я ж сказал - пример кода сильно упрощен, только чтобы обозначить проблему. там не только символ 'A', там много вариантов анализа. и в некоторых case свои циклы. ну читайте же все, что я написал...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Billi34
Открыл глаза
Сообщения: 64
Зарегистрирован: Чт июн 09, 2016 18:24:41

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

Сообщение Billi34 »

У меня еще очень не стабильный тактирующий сигнал приходящий на PIND.B1 Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4

Добавлено after 5 minutes 6 seconds:
Я наверное плохо искал в примерах. А герцовый генератор вида
PORTD.B4 =1;Delay_ms(500);
PORTD.B4=0;Delay_ms(500);

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

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

Сообщение WiseLord »

Аппаратным таймером воспользуйтесь. Он обеспечит прерывания через нужные периоды времени, в которых можно и светодиодом мигнуть, и кнопки опросить. Лишь бы было желание от всех этих вызовов delay избавиться.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3695717#p3695717"]там не только символ 'A', там много вариантов анализа.[/uquote]Что это меняет? А ничего.

[uquote="Billi34",url="/forum/viewtopic.php?p=3695685#p3695685"]о.к.[/uquote]Да не Ок как раз таки. Во-первых, оно тупо не скомпилируется по формальному признаку - количество { и } не совпадает. Во-вторых, ты уверен, что хотел if(t=1), а не if(t==1) ? В-третьих, стройное форматирование кода - половина читаемости и понимаемости. В-четвёртых, ты сам то понимаешь как оно должно работать? Резюме - переписывать с нуля.


[uquote="Billi34",url="/forum/viewtopic.php?p=3695731#p3695731"]Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4[/uquote]А ты даташит на контроллер дальше названия читал? Ну там про таймеры или прерывания???
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Billi34, Ваша проблема в другом. Вы многократно читаете с пинов, забывая, что пин мог поменять свое значение между последовательными чтениями с него. Это же не переменная в памяти, а порт. Правильней, считывать сразу значение всего порта в переменную, а потом уже с ней разбираться, а читать из порта только тогда, когда нужны свежие данные оттуда. Не забывайте, что к моменту изменения данных на B1 может измениться и значение на B0.
goto mesto_1 однозначно не требуется, так как t Вы обнуляете. Достаточно continue. В конце же else ... goto mesto_1 вообще не нужен. Все равно туда управление попадет при любых раскладах.
goto mesto_2 тоже не неужен. Достаточно на месте метки mesto_2 начать цикл while(t) и закончить его после последнего if(PIND.B1&&t)

Ошибок много. На одну из них VladislavS уже указал. Код {PORTB.В1+0} вообще смысла не имеет.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3695741#p3695741"]Во-вторых, ты уверен, что хотел if(t=1), а не if(t==1) ?[/uquote]
Обычно компилятор выдаёт варнинг в этом случае. И тут: либо 1) автор его отключил; либо 2) забивает на все варнинги компилятора.
Автору: на варнинги забивать не стОит. А отключать их стоит когда наберётесь опыта и начнёте понимать что делаете (т.е. - не скоро).

[uquote="VladislavS",url="/forum/viewtopic.php?p=3695741#p3695741"]В-третьих, стройное форматирование кода - половина читаемости и понимаемости.[/uquote]
Точно!! Такой бурелом даже смотреть нет никакого желания.
Порядок в голове начинается с порядка на рабочем столе в исходниках.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

VladislavS писал(а):Что это меняет? А ничего.
это меняет все - простой способ с goto заменяется весьма костыльным способом со сложными условиями в каждом цикле, в дополнительных if-break внутри switch и т.п.

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

Мой уютный бложик... заходите!
Ответить

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