подскажите как вернуться в случае невыполнение определенного условия в начало текста программы. (С++ Билдер 6)
после нажатия кнопки идет целая куча операций, функций итп. в определенный момент после проверки условия, необходимо вернуться на одну из первых операций.. как это сделать.
П.С. возможно описал по-идиотски, но постарайтесь помочь
Форумчанин
Регистрация: 03.02.2008
Сообщений: 213
Функция GOTO перемещает на метку в любое место где стоит метка но в пределах функцыи.
Пишу программы на заказ, контакты под аватаром!
Отзывы тут
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
вроде не рекомендуется её использовать.
Дружите с Linq 😉
Форумчанин
Регистрация: 15.10.2008
Сообщений: 822
Кто не рекомендует использовать. Конечно при использовании goto несколько теряется прозрачность алгоритма,но в общем я не встречал аналогов этой функции.Вообще раньше все строилось на goto,в том же фортране..
Не давай организму поблажки, каждый день тренируй его в шашки..
Точки восстановления: КАК ОТКАТИТЬ WINDOWS
Источник: www.programmersforum.ru
Как заставить мою программу вернуться к началу, основываясь на пользовательском вводе?
Я пытаюсь создать структуру повторения, когда в конце кода набираю «Y», чтобы снова запустить «проверку страховой цены».
#include using namespace std; int main() < // Declaration of variables char animal, status, continue_; int i=0; //Begin Loop cout>animal; if(animal==’D’ || animal==’d’) < cout>status; if(status==’Y’ || status==’y’) cout else if (animal==’C’ || animal==’c’) < cout>status; if(status==’Y’ || status==’y’) cout else if (animal==’B’ || animal==’b’ || animal==’R’ || animal==’r’) cout>continue_; if(continue_==’n’ || continue_==’N’) cout
Как сделать цикл кода обратно в начало?
Решение
do < // begin loop . >while(continue_!=’n’ continue_!=’N’);
Другие решения
Ну, для начала вам понадобится петля …
В этом примере, вероятно, цикл while (предварительное тестирование, если вы заинтересованы в его поиске)
Чтобы достичь того, что вы хотите, вам понадобится логический флаг, и он будет запускать цикл, пока флаг установлен в значение true.
(Предполагая, что остальная часть вашего кода работает нормально)
// Declaration of variables char animal, status, continue_; int i=0; bool running = true;//Begin Loop while (running == true) < // Rest of program cout>continue_; if(continue_==’n’ || continue_==’N’) < cout> return 0; >
Б. Уорд прав, вы должны использовать «вложенные» циклы do-while, чтобы полностью решить вашу проблему. Потому что в вашем коде есть другие условия, которые необходимо выполнить, прежде чем программа сможет продолжить работу, и они также потребуют услуг цикла do-while. Как это;
#include using namespace std; int main() < // Declaration of variables char animal, status, continue_; int i=0; //Begin Loop do < cout> animal; if(animal==’D’ || animal==’d’) < cout>status; if(status==’Y’ || status==’y’) < coutelse if(status ==’N’ || status==’n’) < coutelse < cout>while(status != ‘y’ || status != ‘Y’ || status != ‘n’ || status != ‘N’); > else if (animal==’C’ || animal==’c’) < cout>status; if(status==’Y’ || status==’y’) < coutelse if(status ==’N’ || status==’n’) < coutelse < cout>while(status != ‘y’ || status != ‘Y’ || status != ‘n’ || status != ‘N’); > else if (animal==’B’ || animal==’b’ || animal==’R’ || animal==’r’) cout cout>continue_; if(continue_==’n’ || continue_==’N’) coutwhile(continue_ == ‘y’ || continue_ == ‘Y’); return 0; >
Источник: web-answers.ru
10 ФИШЕК YOUTUBE, которые мало кто знает
Arduino.ru
У меня такой вопрос: можно ли реализовать возврат к началу цикла програмы после снятия внешнего прерывания? Т.е.выход из подпрограммы прерывания в начало основного цикла loop(). Нигде решения не нашел. Спасибо.
- Войдите на сайт для отправки комментариев
Втр, 02/06/2015 — 23:41
Как правило такая постановка задачи — не корректный способ решить её.
Выход из прерывания происходит в точку, где произошло это прерывание.
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 01:06
kisoft пишет:
Как правило такая постановка задачи — не корректный способ решить её.
Выход из прерывания происходит в точку, где произошло это прерывание.
Чё не коректная. Такое прерывание называется РЕСЕТ.
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 07:09
Ресет это не только ценный мех ещё и вызов setup()
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 07:32
Да простят меня боги программирования и прогрессивная мировая общественность, но может быть оператор goto ? (http://arduino.ru/Reference/Goto) Ну, если уж совсем никак иначе..
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 07:44
setup можно обойти выяснив что мы туда попали не из-за пропадания-включения питания.
Ещё lehak давно об этом писАл.
Ну а переход можно сделать разрешив WDT
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 20:01
«Мы» тут все пытаемся оседлать сферического коня в вакууме, не зная задачи, потому можно сделать как угодно и при перезагрузке можно определить по какой причине мы перезагружены, и обойти setup тоже можно, только чаще всего задача не стОит, чтобы из пушки по воробьям палить, разве что если скушно и из спортивного интереса. Можно и при выходе из прерывания восстановить флаги и подменить в стеке адрес выхода на любой нужный адрес, только зачем такой хардкод нужен?
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 22:31
Всем спасибо) Опробывал return. Ничего так ,вроде, работает.
int intPin = 0; void setup() < attachInterrupt(intPin,pause,LOW); //функция прерывания pinMode(2, INPUT); //настраиваем контакт 2 на вход(он же intPin) >void loop() < . . if (digitalRead(2) == LOW). . >
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 23:39
Вот вот, как всё просто 😉
Нахрена мерседес если ездить только на огород за картошкой 🙂
А ещё очередная загадка, когда судя по комментариям intPin должен быть пином 2, а реально, пин 0. Эхх..
- Войдите на сайт для отправки комментариев
Ср, 03/06/2015 — 23:47
Да нет же) Это не пин , это номер прерывания. Прерывание «0», а пин для прерывания действительно задействован «2». Кстати, плата ардуино Уно.
- Войдите на сайт для отправки комментариев
Чт, 04/06/2015 — 07:05
Не разглядел вчера в темноте 🙂
В таком случае название странное, слово pin сбило с толку.
- Войдите на сайт для отправки комментариев
Чт, 04/06/2015 — 11:41
Ну в общем да) Так будет короче и понятнее)
void setup() < attachInterrupt(0,pause,LOW); //функция прерывания (на втором контакте UNO) pinMode(2, INPUT); //настраиваем контакт 2 на вход >void loop() < . . if (digitalRead(2) == LOW). . >
- Войдите на сайт для отправки комментариев
Втр, 09/02/2016 — 22:18
Небольшое вступление. Сразу же прошу прощения и сообщаю что в написании программ МК я лох педальный. На самом деле у меня вторая радиолюбительская категория и с микросхемами на обычной логике никаких проблем нет. С монтажом пайкой и прошивкой МК тоже все в порядке.
Читаю книги, смотрю видео но не всегда там есть ответы. Вообщем в большей степени для обучения и возможно для дальнейшего применения на мотоцыкле делаю стробоскоп с двумя светододами и с несколькими режимами моргания.
В программе все просто до безобразия. Прерывание от кнопки с каждым нажатием прибавляет по единице к одной переменной. Потом в цикле с помощью if смотрим чему равна переменная и в зависимости от этого выполняется то или иное.
Собственно все работает, режимы переключаются светодиоды моргаю так как задумано. Но так как после прерывания выполнение продолжается именно с того места откуда оно было вызвано то режимы переключаются не сразу.
Там в некоторых режимах работает for и вот пока он не закончиться визуально режим не переключится, хоть переменная и обновилась. Вообщем друзья, как мне победить это? Что бы переключалось мгновенно, в независимости от того где остановилась программа.
Единственным я вижу это как то после прерывания прыгать на начало цикла, почему собственно и написал сюда. Экспериментировал и return и continue и даже с goto но что то ничего не получается. Может изначально сделать как то иначе? Подскажите примерно по какому пути идти чтобы решить такую задачу? Я дальше сам допетрю.
Спасибо всем большушие!
[code] int buttonInt = 0; // Прерывание 0 на втором пине) int led1 = 5; // Первый светодиод int led2 = 6; // Второй светодиод int btn = 3; // Кнопка volatile byte regim = 0; // Переменная для прерывания void setup() < pinMode(led1, OUTPUT); // Пятый пин на выход первый светодиод pinMode(led2, OUTPUT);// Шестой пин на выход второй светодиод attachInterrupt(buttonInt, change, RISING); // прерывание по мпадающему фронту Serial.begin(9600); // Для контроля >//обработчик прерывания void change() < regim = regim + 1; // С каждым разом увеличиваем regim на 1 if (regim >11) // Если regim больше 11 regim = 0;// То сбрасываем regim в 0 > // Тут проверкой if выбираються режимы работы светодиодов void loop() < if (regim == 0) Serial.println(«regim 0»); delay(250); //============================= if (regim == 1) < Serial.println(«regim 1»); delay(250); for (int i = 0; i < 3; i++) < digitalWrite(led1, HIGH); delay(50); digitalWrite(led1, LOW); delay(50); >delay(250); for (int i = 0; i < 3; i++) < digitalWrite(led2, HIGH); delay(50); digitalWrite(led2, LOW); delay(50); >> //============================== if (regim == 2) < Serial.println(«regim 2»); delay(500); for (int i = 0; i < 2; i++) < digitalWrite(led1, HIGH); delay(40); digitalWrite(led1, LOW); delay(60); >delay(500); for (int i = 0; i < 2; i++) < digitalWrite(led2, HIGH); delay(40); digitalWrite(led2, LOW); delay(60); >> //============================ if (regim == 3) < Serial.println(«regim 3»); delay(500); for (int i = 0; i < 3; i++) < digitalWrite(led1, HIGH); delay(50); digitalWrite(led1, LOW); delay(80); >delay(500); for (int i = 0; i < 3; i++) < digitalWrite(led2, HIGH); delay(50); digitalWrite(led2, LOW); delay(80); >> //====================== if (regim == 4) < Serial.println(«regim 4»); delay(150); for (int i = 0; i < 6; i++) < digitalWrite(led1, HIGH); delay(80); digitalWrite(led1, LOW); delay(80); >delay(150); for (int k = 0; k < 6; k++) < digitalWrite(led2, HIGH); delay(80); digitalWrite(led2, LOW); delay(80); >> //=========================== if (regim == 5) < Serial.println(«regim 5»); delay(70); for (int i = 0; i < 7; i++) < digitalWrite(led1, HIGH); delay(30); digitalWrite(led1, LOW); delay(70); >delay(70); for (int i = 0; i < 7; i++) < digitalWrite(led2, HIGH); delay(30); digitalWrite(led2, LOW); delay(70); >> //============================= if (regim == 6) < Serial.println(«regim 6»); delay(250); for (int i = 0; i < 8; i++) < digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); delay(40); digitalWrite(led1, LOW); digitalWrite(led2, LOW); delay(40); >> //============================== if (regim == 7) < Serial.println(«regim 7»); delay(400); for (int i = 0; i < 10; i++) < digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); delay(30); digitalWrite(led1, LOW); digitalWrite(led2, LOW); delay(100); >> //=============================== if (regim == 8) < Serial.println(«regim 8»); for (int i = 0; i < 255; i++) < analogWrite(led1, i); delay(3); >for (int i = 0; i < 3; i++) < digitalWrite(led1, HIGH); delay(50); digitalWrite(led1, LOW); delay(50); >for (int i = 255; i >= 0; i —) < analogWrite(led1, i); delay(3); >// Второй диод for (int i = 0; i for (int i = 0; i < 3; i++) < digitalWrite(led2, HIGH); delay(50); digitalWrite(led2, LOW); delay(50); >for (int i = 255; i >= 0; i —) < analogWrite(led2, i); delay(3); >> //=============================== if (regim == 9) < Serial.println(«regim 9»); for (int i = 0; i < 255; i++) < analogWrite(led1, i); analogWrite(led2, i); delay(3); >for (int i = 0; i < 3; i++) < digitalWrite(led1, HIGH); digitalWrite(led2, HIGH); delay(50); digitalWrite(led1, LOW); digitalWrite(led2, LOW); delay(50); >for (int i = 255; i >= 0; i —) < analogWrite(led1, i); analogWrite(led2, i); delay(3); >> //==================================== if (regim == 10) < Serial.println(«regim 10»); for (int i = 0; i < 255; i++) < analogWrite(led1, i); delay(3); >for (int i = 0; i < 4; i++) < digitalWrite(led2, HIGH); delay(50); digitalWrite(led2, LOW); delay(50); >for (int i = 255; i >= 0; i —) < analogWrite(led1, i); delay(3); >// Второй диод for (int i = 0; i for (int i = 0; i < 4; i++) < digitalWrite(led1, HIGH); delay(50); digitalWrite(led1, LOW); delay(50); >for (int i = 255; i >= 0; i —) < analogWrite(led2, i); delay(3); >> //================================ if (regim == 11) < Serial.println(«regim 11»); for (int i = 0; i < 255; i++) < analogWrite(led1, i); delay(3); >for (int i = 255; i >= 0; i —) < analogWrite(led1, i); delay(3); >// Второй диод for (int i = 0; i for (int i = 255; i >= 0; i —) < analogWrite(led2, i); delay(3); >> > [/code]
- Войдите на сайт для отправки комментариев
Источник: arduino.ru