Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/47: Рейтинг темы: голосов - 47, средняя оценка - 4.94
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
1

Как выйти из бесконечного цикла?

14.10.2012, 23:47. Показов 8428. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть вот такая специфическая форма записи бесконечного цикла:

Bash
1
2
3
for /L %%a in (0,0,0) do goto :nxt
:nxt
pause
Мне нужно перейти по метке.
Именно перейти, а не вообще выйти из скрипта.

А вот не получается, хоть визуально и должно.
Команда Exit работает, Goto - нет.

Добавлено через 6 минут
прибегнул к хитрости:
Bash
1
2
3
4
5
6
7
for /L %%a in (0,0,0) do call :redirection
:nxt
pause
exit
 
:redirection
goto :nxt
Но ведь "это не наш метод"
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2012, 23:47
Ответы с готовыми решениями:

Старый борланд: как выйти из бесконечного цикла по нажатию заданной клавиши?
Короче нужно сделать прогу которая считает сколько отрицательных,положительных,равных 0 ввел...

Не могу выйти с бесконечного цикла
Есть код, пробую запустить в emu8086, но не могу выйти с бесконечного цикла суть задания - Поиск и...

Выйти из бесконечного цикла для вызова деструктора
Здравствуйте! Пишу программку, в которой используются объекты и классы. Имею цикл, в котором...

Как выйти из цикла?
Здрасьте!Я новичок, и у меня достаточно глупый вопрос. Как тут реализовать выход из цикла? ...

5
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
16.10.2012, 06:20  [ТС] 2
Вообщем пока, лучше пользоваться дедовским методом:

Bash
1
2
3
:Start
::Наш код
Goto :Start
А первым случаем пользоваться, когда требуется записать код в одну строку.
Например, такое может понадобится для Shell: Самоуничтожения программы
0
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
11.12.2012, 15:31 3
Если рассматривать такой код
Bash
1
for /L %%a in (0,0,0) do goto :nxt
как
Bash
1
FOR.EXE /L %%a in (0,0,0) do goto :nxt
то станет понятно, почему нужно использовать двойные проценты и почему goto не работает.

Вот аналогичный пример:
1.cmd
Bash
1
2
call 2.cmd
:stop

2.cmd
Bash
1
goto :stop
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
12.12.2012, 17:28  [ТС] 4
Цитата Сообщение от gimntut Посмотреть сообщение
Если рассматривать такой код
for /L %%a in (0,0,0) do goto :nxt
как
FOR.EXE /L %%a in (0,0,0) do goto :nxt
то станет понятно, почему нужно использовать двойные проценты и почему goto не работает.
Про двойные проценты, если честно, не понял.
Они нужны потому, как в среде интерпретируются как 1 знак %. А сам процент - арифметический оператор.

Про FOR.EXE тоже намек не совсем понял. Вы имеете в виду, если FOR рассматривать, как внешнюю программу, тогда она не увидит мою метку... Но ведь это не есть совершенно другая среда, как в примере с "Call 2.cmd".
Ведь такой вариант работает! :
Bash
1
2
for /L %%A in (0,1,2) do (echo here& goto :nxt)
:nxt
Хотя и здесь тоже примечательно, что интерпретатор рассматривал операционную часть (echo here& goto :nxt) - 3 раза как задано в условиях, но как видно из консоли - не выполнял ее на 2-й и 3-ей итерации:
Как выйти из бесконечного цикла?
0
887 / 189 / 16
Регистрация: 18.07.2011
Сообщений: 260
12.12.2012, 17:47 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dragokas Посмотреть сообщение
Но ведь это не есть совершенно другая среда
В точку!
Если бы была другая среда, то if...goto не работало бы.
Хотя среда остаётся той же, но правила для параметров for такие же как и для внешних программ.
Если попробовать передать внешней программе строку начинающуюся на %, то ничего хорошего из этого не выйдет.
А %% передаётся как внутрь for, как %. Когда for работает не из батника, то достаточно одинарного процента, т.к. в таком случае for как бы самостоятельная программа.
На самом деле for не является самостоятельной. Но если её воспринимать таковой, то можно избежать проблема подобных описанной.
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
13.12.2012, 13:18  [ТС] 6
Собственно из своего же скрина я понял почему не получается выход из такого цикла.
Как видим, несмотря на goto при условии в 3 итерации команда For просматривает оперируемую часть все 3 раза.

Соответственно для бесконечного числа итераций, For не может завершить обработку, т.к. таких частей после Do будет рассмотрено бесконечное кол-во.

Что примечательно, саму метку вне цикла его среда видит.
Это можно увидеть из эксперимента:
Bash
1
2
FOR /L %%a in (0,1,2) do goto :nxt
pause
Как выйти из бесконечного цикла?

Интерпретатор закрывается аварийно.

Т.е. даже некорректная команда не может заставить выйти из цикла после первой итерации.
Единственный способ выхода - это завершить работу сценария:
Bash
1
2
3
Echo. 1>&3 2>&4 3>test.log 4>&3
FOR /L %%a in (0,1,2) do exit
pause
Цитата Сообщение от test.log
D:\_PRO\CMD-BAT\Test>FOR /L %a in (0 1 2) do exit

D:\_PRO\CMD-BAT\Test>exit
0
13.12.2012, 13:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2012, 13:18
Помогаю со студенческими работами здесь

Как выйти из цикла while();
#include <iostream> #include <fstream> #include <cctype> #include <string> #include <vector>...

do while - как выйти из цикла?
Подскажите пожалуйста, а то я уже всю голову "сломал", почему при вводе "А" цикл не прерывается???...

Как выйти из цикла
Помогите пож дописать макрос! Нужно найти номер позиции первой буквы кириллицы в строке как...

Как выйти из цикла? Не получается
Есть задача: Из-за высокой цены бензина водители озабочены затратами топлива своих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru