Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как выйти из for цикла?


Автор: Wowa 16.7.2002, 23:33
Думал, что смогу отделаться через last, так не получилось :)

Автор: Baa 16.7.2002, 23:45
Цитата(Admin @ 17.7.2002, 00:33)
Думал, что смогу отделаться через last, так не получилось :)

break ;-)

Автор: Максим 2.10.2002, 20:11
Выход из цикла, помойму команда "EXIT";

Автор: Baa 2.10.2002, 20:16
Цитата(Guest @ 02.10.2002, 13:11)
Выход из цикла, помойму команда "EXIT";

Exit совершает ничто иное как безусловный переход в конец процедуры (jmp end;) т.е. выход из неё.
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 Exit;
 ShowMessage ('This will never happen!');
end;



Автор: Song 2.10.2002, 23:12
Если вызов Exit производится внутри цикла, то компилятор автоматически сначала подставляет Break.
Если вызов Exit идёт и блока try .. finally .. end то компилятор автоматически подставляет Abort
Так что не всё так безусловно.

Автор: Baa 3.10.2002, 02:06
Цитата(Song @ 02.10.2002, 16:12)
Если вызов Exit производится внутри цикла, то компилятор автоматически сначала подставляет Break.
Если вызов Exit идёт и блока try .. finally .. end то компилятор автоматически подставляет Abort
Так что не всё так безусловно.

Буду знать...а переход и в том и в другом случае делается безусловный

Автор: Baa 3.10.2002, 03:47
Цитата(Song @ 02.10.2002, 16:12)
Если вызов Exit производится внутри цикла, то компилятор автоматически сначала подставляет Break.
Если вызов Exit идёт и блока try .. finally .. end то компилятор автоматически подставляет Abort
Так что не всё так безусловно.

procedure TForm1.Button1Click(Sender: TObject);
begin
 while true do
 begin
   ShowMessage ('Test');
   Exit;
 end;
 ShowMessage ('This will never happen');
end;
А какая разница? Попробуй вместо Exit поставить break... Exit - это выход из процедуры без каких либо подставлений... Как проверить? смотрим код: jmp +$0a
А куда это мы прыгаем? правильно, прямо на ret в обход последней функции...Так что все таки это безусловный выход из процедуры.

Автор: Song 3.10.2002, 06:20
Нет, здесь вызов выхода из текущей обработки и выход обрабатывается одноврменно, через стёк т.е. через трассировку или подставкой чего-нить в код Вы не проверите, поэтому придется мне поверить на слово  :), т.е. на самом деле Break выполняется однако управление на ShowMessage() не передастся, так запрограммировано.

Автор: Baa 3.10.2002, 09:20
Вобщем, так или иначе, если мы хотим, чтобы все, что идет после цикла выполнилось Exit никак не подходит :)

Автор: Ampersand 3.10.2002, 23:38
Вообще Паскаль задумывался как строгий, структурный язык. Соответственно, всякие вольности типа выхода из процедуры в любой точке и произвольное прекращение цикла в нем не допускаются... В Дельфях можт уже все испортили, не знаю... А вообще в данном случае классика - замена for на while. Еще можно попробовать принудительно переменную цикла увеличить до верхней границы. На крайняк goto...

Автор: Vit 4.10.2002, 00:29
Цитата(Ampersand @ 03.10.2002, 07:38)
В Дельфях можт уже все испортили, не знаю...

1) Exit и Break появились в Turbo Pascal (не то в 6.0, не то в 7.0)
2) На чистом Паскале можно программировать наверное лишь чистую математику, да простейшие cgi. В связи с полным отсутствием интерфейса, экспорта функций, объектов и т.п. использование чистого классического Паскаля практически невозможно.
3) В настоящее время существует лишь одна распространённая реализация Паскаль сделанная Борландом (только не надо говорить что есть еще много - есть то они есть, да пользователей их пренебрежительно мало), следовательно стандарт  Паскаля De Facto определяют версии от Borland (точно так же как Basic определяется MS)

Автор: rhf 4.10.2002, 01:27
2 Ampersand, вообщето break (выход из цикла) и exit (выход из процедуры/функции) идут из старого доброго паскаля и я рад, что никто ничего НЕ испортил и НЕ выкинул их из Object Pascal. И давайте не будем вспоминать про goto :)

Автор: Vit 4.10.2002, 02:20
Цитата(rhf @ 03.10.2002, 09:27)
2 Ampersand, вообщето break (выход из цикла) и exit (выход из процедуры/функции) идут из старого доброго паскаля

Нет, не идут! В спецификации Паскаля их нет. Они появились, как я уже говорил, в Tp6 (это примерно 1993 год), до этого их ни в одной реализации вообще не было. А так называемый Object Pascal появился примерно тогда-же в том же TP6 c появлением Turbo Vision, ни в стандарте Паскаля, ни в одной реализации Паскаля до того никаких объектов вообще не было. Добавление объектов и разработка спецификации Object Pascal целиком заслуга Борланд, другие реализации Object Pascal появились только лет через 5 после Object Pascal от Борланд и практически базировались на последнем.

Автор: Song 4.10.2002, 02:40
Моя версия Tp7
Ну уж никак не <=Tp5 :-)

Автор: Vit 4.10.2002, 02:55
Цитата(Song @ 03.10.2002, 10:40)
Моя версия Tp7
Ну уж никак не <=Tp5 :-)

Это точно, в TP5.5 абсолютно точно не было ни объектов, ни exit, ни break (только Halt был для любителей :) )

Автор: Chingachguk 4.10.2002, 03:39
Да, недавно с удивлением обнаружил, что в tp ~ 6 -5 версии нету break...

Немного не в тему, но, возможно, покажется забавным: до недавнего времени я писал в конторе на языке Clarion(DOS). Так вот, как-то я с удивлением обнаружил, что есть "кларионисты", которые совершенно серьезно считали, что написав подряд несколько break, можно выйти сразу из цикла вложенности больше 1 ! Выглядело это так:

loop ! Это так цикл выглядит - пустой
    loop
        loop
          ! Якобы выходим сразу на метку Done
          break
          break
          break
.   .   .

Done:

Эксперимент показал, что нифига ж)))
goto форева !

Автор: rhf 4.10.2002, 04:51
2 Vit, под "старым добрым паскалем" я имел ввиду BP 7.0 :) а там уже все есть

Автор: Vit 4.10.2002, 04:59
Цитата(rhf @ 03.10.2002, 12:51)
2 Vit, под "старым добрым паскалем" я имел ввиду BP 7.0 :) а там уже все есть

Ну для кого какой, для меня "старый добрый" - это тот Паскаль с которого я начинал - Pascal под RT11SJ, это был примерно 1987 год(уж не знаю кто его производитель), а если "старый добрый" для x86 то Turbo Pascal  3.0 - ещё без оболочки, это примерно 1990 год. Может я на год-два с датами ошибся - давно это было.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)