Вопросы по С/С++ (СИ)
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Billi34, это не скомпилиться. Лексема else применятся только с if, но уж никак не с while.
- Реклама
Re: Вопросы по С/С++ (СИ)
Понял ошибку. Суть от этого не меняется. Перефразирую: МК перейдет к этой строке в которой написан оператор else.
Поправил в предидущем посте.
Поправил в предидущем посте.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Не так. Если i не меньше 18, то сначала t сбрасывается в 0, а затем управление передается на метку mesto_1. А вот где эта метка - мне не ведомо. Внутри цикла ее нет, значит она где-то за пределами цикла и поэтому происходит выход из цикла.Billi34 писал(а): По превышению i более 18 МК переходит в mesto_1. сбрасевает t в ноль.
Опять не так. В случае, если любое из трех логических выражений в while окажется ложным, произойдет выход из цикла и вполнение "следующая строка кода". То есть, выход из цикла произойдет ИЛИ если PIND.B1=0 ИЛИ если i>=20 ИЛИ если t=0Billi34 писал(а):В случае возникновения ПИН В1 лог. единицы при значениях i меньше 18 МК переходит к оператору else
Re: Вопросы по С/С++ (СИ)
Не меньше значит больше? По сути если 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
Добавлено 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: Вопросы по С/С++ (СИ)
Billi34, дорогой, переходи на светлую сторону. Не надо придумывать алгоритмы, которые не понимает как работает даже автор. Во-первых, забудь оператор goto. Поверь, это не больно. Во-вторых, оформляй функционально законченные фрагменты в виде функций с локализацией всех необходимых для её работы данных/переменных внутри. В-третьих, делай простые циклы с понятными условиями их окончания. Простой и понятный код с большей вероятностью работает правильно. Поднаберёшься опыту - будешь применять продвинутые техники, благо в С, а там глядишь и С++ есть куда двигаться.
- Реклама
Re: Вопросы по С/С++ (СИ)
Ну почему же не понимаю, все очень даже понимаю. И по строкам разложил. А без goto как выскочить из цикла? И в начало цепочки событий?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
А не надо никуда "выскакивать". Перестрой алгоритм по другому. Вот у тебя есть "цепочка событий". Сколько раз она должна выполниться? Напиши цикл который выполняет эту цепочку событий нужное количество раз. А потом будешь внутри цикла писать саму "цепочку".
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Billi34, приведите весь код, тогда покажу, как можно сделать без goto. Только вставляйте его, как Code (кнопочка такая), а не прямо в текст сообщения.
Re: Вопросы по С/С++ (СИ)
В том то и дело что цепочка тактируется PINB и длинна цепочки событий может быть разной. Я уже думал так сделать, как Вы предложили Не разрешимые дилеммы не дали хода. Недостаток знаний.
Последний раз редактировалось Billi34 Пт сен 06, 2019 17:32:54, всего редактировалось 1 раз.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Вопросы по С/С++ (СИ)
Billi34, не бывает неразрешимых проблем. Приведите весь код, пожалуйства.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
вот со всем сказанным в этом же сообщении соглашусь, а с процитированным - не могу. лично мне было довольно "больно" без goto решить самую простую задачу анализа символов в строке, если при обнаружении некоторых надо закончить анализ, а для остальных просто выполнить простейшие манипуляции с ними и другими данными.VladislavS писал(а):забудь оператор goto. Поверь, это не больно
Код: Выделить всё
while(ch = *s++){
switch(ch){
case 'A' : goto m1;
case 'D' : s[-1] = 'd'; break;
default:
continue;
}
}
m1:
//я не говорю, что это нельзя сделать без goto, я говорю, что лично я это готов сделать либо из чисто спортивного интереса, либо не готов вообще - добавление новых переменных, дробление кода на функции и т.п. "методы" избегания goto слишком болезненны для меня, потому как я очень ленивый...
кстати, смотрел исходники avr-libc... там goto очень много... видимо, не один я ленивый
Добавлено after 3 minutes 9 seconds:
то есть я хочу сказать, что в тех местах, где не помогает break, обойтись без goto представлет проблему.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[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: Вопросы по С/С++ (СИ)
я ж сказал - пример кода сильно упрощен, только чтобы обозначить проблему. там не только символ 'A', там много вариантов анализа. и в некоторых case свои циклы. ну читайте же все, что я написал...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
У меня еще очень не стабильный тактирующий сигнал приходящий на PIND.B1 Может подскажите как поделить на миллион тактовую частоту и вывести например на PORTD.B4
Добавлено after 5 minutes 6 seconds:
Я наверное плохо искал в примерах. А герцовый генератор вида
PORTD.B4 =1;Delay_ms(500);
PORTD.B4=0;Delay_ms(500);
тормозит выполнение всей программы. Зато мигает диодик.
Добавлено 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: Вопросы по С/С++ (СИ)
Аппаратным таймером воспользуйтесь. Он обеспечит прерывания через нужные периоды времени, в которых можно и светодиодом мигнуть, и кнопки опросить. Лишь бы было желание от всех этих вызовов delay избавиться.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Вопросы по С/С++ (СИ)
[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]А ты даташит на контроллер дальше названия читал? Ну там про таймеры или прерывания???
[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} вообще смысла не имеет.
goto mesto_1 однозначно не требуется, так как t Вы обнуляете. Достаточно continue. В конце же else ... goto mesto_1 вообще не нужен. Все равно туда управление попадет при любых раскладах.
goto mesto_2 тоже не неужен. Достаточно на месте метки mesto_2 начать цикл while(t) и закончить его после последнего if(PIND.B1&&t)
Ошибок много. На одну из них VladislavS уже указал. Код {PORTB.В1+0} вообще смысла не имеет.
Re: Вопросы по С/С++ (СИ)
[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]
Точно!! Такой бурелом даже смотреть нет никакого желания.
Порядок в голове начинается с порядка на рабочем столе в исходниках.
Обычно компилятор выдаёт варнинг в этом случае. И тут: либо 1) автор его отключил; либо 2) забивает на все варнинги компилятора.
Автору: на варнинги забивать не стОит. А отключать их стоит когда наберётесь опыта и начнёте понимать что делаете (т.е. - не скоро).
[uquote="VladislavS",url="/forum/viewtopic.php?p=3695741#p3695741"]В-третьих, стройное форматирование кода - половина читаемости и понимаемости.[/uquote]
Точно!! Такой бурелом даже смотреть нет никакого желания.
Порядок в голове начинается с порядка на рабочем столе в исходниках.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
это меняет все - простой способ с goto заменяется весьма костыльным способом со сложными условиями в каждом цикле, в дополнительных if-break внутри switch и т.п.VladislavS писал(а):Что это меняет? А ничего.
а в остальном - все хорошо
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


