Свежие обсуждения
Микроконтроллеры

Ликбез по С для микроконтроллеров PIC

1 46 64

от множества ретурнов гоуту и бреков избавляются правильным использованием операторов условного перехода (if, swith) и цыклов, если наверх надо перейти(for, while, do)

 

Вот, попытался повыбрасывать лишнее. Для выхода из функций используется их обычное завершение(когда закончаться все операторы). Логика(если не ошибся я нигде) осталась прежней.

174112.c

 

Подумал, что проще ввести ещё один флаг, который будет подниматься через case (когда "плюс", флаг =1, когда "минус", то флаг=0), чем плодить одинаковые ветки кода на "плюс" и "минус" отдельно. Слушаю соображения по аттачу. Считаю себя настолько крутым алгоритмером, что аж подпись добавил На самом деле, смотреть страшно....

 

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

 

6П3С: Как мне выйти из всех циклов сразу без goto ?
Вот пару вариантов что сразу пришли на ум:
1)Поднять какой нибудь флаг(логической переменной присвоить true) и выполнить оператор break или continue а во всех условиях окончания циклов прописать дополнительно проверку этого флага.
2)Загнать все циклы в отдельную подпрограмму(функцию) и при выполнении условия вийти из подпрограмы по return или exit.

Вообщем, могу на спор любую структуру с goto переписать без него
Правда, может это иногда будет и более затрано с точки зрения ресурсов и быстродействия, но однозначно более наглядно и более правильно с позиции структурного программирования.

6П3С: Вот есть у меня штук эдак восемь вложенных циклов. (Решаю задачу методом перебора)
И вообще, что-то мне кажется, что у Вас не оптимальный алгоритм. Может количество циклов можно раз в 4-ре уменьшить?

 

Арс: что-то мне кажется, что у Вас не оптимальный алгоритм
Зато:
Арс: но однозначно более наглядно

Арс: ...могу на спор любую структуру с goto переписать без него
Это вроде как "могу написать фортрановскую программу на любом языке программирования"

 

По вопросу goto можно долго спорить, однако, всегда есть по крайней мере 2 более правильных решения:
1. Арс: И вообще, что-то мне кажется, что у Вас не оптимальный алгоритм. Может количество циклов можно раз в 4-ре уменьшить?
2. Арс: Загнать все циклы в отдельную подпрограмму(функцию) и при выполнении условия вийти из подпрограмы по return И для того, что бы это не привело к увеличению издержек существуют inline функции. Только не знаю есть ли в используемом Вами компиляторе возможность использовать inline.

 

В моём случае нет особого смысла использовать inline. Экономия будет незначительной. По сравнению с тем, что крутится в циклах, издержками на вызов функции можно принебречь.

 

Подскажите как через switch сделать условие нажат "плюс" или "минус" ?
Вот такая конструкция работать не хочет:

switch (input(Pin_E0) & input(Pin_E1))
{
case Pin_E0: PlusFlag = 1;
break;
case Pin_E1: PlusFlag = 0;
break;
default: a = 0 ;
}

 

А почему именно через switch? Чем if не устраивает?