(решено) GoTo или repeat until?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: GoTo или repeat until?

Сообщение xterro » 01.09.2015 21:00:01

Ну если уж совсем следовать логике изначальных "примеров" тогда так:

Код: Выделить всё
procedure set_abcde();
begin ... end;

procedure set_fgk();
begin ... end;

var
    checked_result : boolean = false;
    test_completed : boolean = false; { некая переменная для остановки цикла }
    exit_pressed   : boolean = false;

{ инициализация }
set_abcde();
set_fgk();

while not exit_pressed do begin
  while (not test_completed) and (not exit_pressed) do
    begin
        checked_result := functionTest(a,b,c,d,e,f,g,k);
        ProcessMessages;

        if(checked_result = 1) then
        begin
            set_abcde();
            set_fgk();
        end
        else
            set_fgk();
   
           // где-то далее:  test_completed := true 
  end;
end;

И какого-то "усложения" из-за if-а я тут не вижу.
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: GoTo или repeat until?

Сообщение скалогрыз » 01.09.2015 21:06:39

почему никто не говорит, что goto не шибко дружит с try..finally и try..except секциями?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение Mikhail » 01.09.2015 21:08:58

скалогрыз писал(а):почему никто не говорит, что goto не шибко дружит с try..finally и try..except секциями?

Думаю, что автор еще не дорос до этого... :)
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 21:13:16

скалогрыз писал(а):А так же усложнённый вариант №2 оной же

Скалогрыз - это не честно, был дан конкретный пример.
Поверьте можно и с циклами такого навертеть, что даже после компиляции решение не найдётся...

скалогрыз писал(а):почему никто не говорит, что goto не шибко дружит с try..finally и try..except секциями?

А вот это хороший аргумент. Апелляция принята к рассмотрению.

Mikhail писал(а):Ну, например так...

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



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение xterro » 01.09.2015 21:14:28

скалогрыз
Я так понимаю, получится, пять звёдочек, потом пять стрелочек, потом десять десять(или 11, не досчитал...) звёздочек... хотя видимо по задумке должно быть 20* и 20>... либо зависнет все нафег :lol:
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: GoTo или repeat until?

Сообщение Mikhail » 01.09.2015 21:20:25

vitaly_l писал(а):Вы считаете что три вложенных цикла лучше чем GoTo. Правильно?

У Вас тоже три цикла, только написали Вы их с помощью goto. :) Что есть не хорошо. :x
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: GoTo или repeat until?

Сообщение скалогрыз » 01.09.2015 21:21:20

xterro писал(а):Я так понимаю, получится, пять звёдочек, потом пять стрелочек, потом десять десять...

есть ли жизнь на марсе, нет ли жизни на марсе - науке это не известно (с) :mrgreen:

но ответ правильный! читабельность не повышается :)

Добавлено спустя 3 минуты 54 секунды:
vitaly_l писал(а):Скалогрыз - это не честно, был дан конкретный пример.
Поверьте можно и с циклами такого навертеть, что даже после компиляции решение не найдётся...

такого, как в примере выше, просто циклами навертеть нельзя.
как сказано в документации по гото
Jumping from outside a loop to the inside of a loop or vice versa can have strange effects.

в виду технической реализации самих циклов. Т.к. переменная-счётчик цикла может быть оптимизирована компилятором по своему усмотрению. И результат будет не предсказуем.

Внесение goto в свою программу (особенно если процедуры долгие и длинные!), потенциально может привети к "прыжку" из или в цикл.

И даже если такого прыжка не было в изначальном примере, совсем нет гарантии, что он там не повяится когда-нибудь потом

Добавлено спустя 4 минуты 44 секунды:
Кстаате, по-поводу Торвальдса и его любви в goto.
Дело в том, что Торвальдс Си++ не любит, но обажает Си.

А в Си контроль за выполнением кода абсолютно никакой, и всё приходится делать руками (например реализацию exception-ов с try..finally, try..except секциями).
По-этому и goto там используется именно для таких случаев.
О чём кстати писал и выше упомянутый Дейкстра
четкие рекомендации ограничивать использование оператора go to аварийным выходом

в Object Паскале появились и исключения и try..finally (с которыми дружит Exit!) и управляемые типы данных вроде длинных строк и динамических массивов (доя которых глобальный Goto - будет чреват утечками! и по-умолчанию запрещён).
Последний раз редактировалось скалогрыз 01.09.2015 21:31:13, всего редактировалось 1 раз.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 21:30:19

скалогрыз писал(а):но ответ правильный! читабельность не повышается

В Вашем примере, согласен "без полёта на Марс не разобраться".

Mikhail писал(а):У Вас тоже три цикла, только написали Вы их с помощью goto.

Посмотрите первую запись в топике, там два варианта кода. Один из двух циклов, а другой из GoTo и цикла.

В общем пока, что единственный, но ОЧЕНЬ весомый аргумент про try finally ///
Художники в сомненьях... Нужны ещё аргументы.


.

Добавлено спустя 1 минуту 44 секунды:
скалогрыз писал(а):потенциально может привети к "прыжку" из или в цикл.

В это не верю. Это шаманство...
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение скалогрыз » 01.09.2015 21:35:02

vitaly_l писал(а):В это не верю. Это шаманство...

не шаманство!
посмотри на тело своего цилка
Код: Выделить всё
repeat   
         ...     
         test := functionTest(a,b,c,d,e,f,g,k);
         if buttonExit = true then exit;
         ProcessMessages;
      until someGlobalBoolean = true;

там где строчка "...". Никто не знает какой код вдруг там окажется!?
Вдруг кто-то, когда-то (явно не ты, потому что ты бы такого не допустил) появится какой-нибудь goto labelGoTo2; или goto LabelGoto1;? - и это будет прыжок из цикла!

Ведь если ты сам начал использовать goto, ты морально разрешаешь другим людям, работающим с твоим кодом его использовать.
Последний раз редактировалось скалогрыз 01.09.2015 21:35:47, всего редактировалось 1 раз.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение xterro » 01.09.2015 21:35:39

Весь гемор ТС происходит из-за:
1. Неправильно поставленной задачи, пример действительно не алё.
2. Не понимания ТС-ом конструкций языка и не умения их грамотно применять.
3. Не понимания ТС-ом того факта, что на уровне компилятора, все эти цикли и if-ы после компиляции всё равно развернутся в goto, так что незачем усложнять себе жизнь их использованием в коде(собственно для этого и создавались высокоуровневые языки).
4. Не понимания ТС-ом того факта, что использование goto особой оптимизации или ускорения ему не принесет.

Отсюда автор всё никак не может(или не хочет) сделать вывод о том, необходимость использования goto отсутсвует, от слова совсем. Если приходится использовать goto, то нужно смотреть код и алгоритм программы(функции) и перестраивать его, ибо скорее всего он есть унылое говно. Выхожу из этого дискуса, ибо бесперпективняк 8)
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: GoTo или repeat until?

Сообщение скалогрыз » 01.09.2015 21:37:12

xterro писал(а):Если приходится использовать goto, то нужно смотреть код и алгоритм программы(функции) и перестраивать его, ибо скорее всего он есть унылое говно.

а для аварийоного выхода в паскале есть и assert() и halt() и exception-ы.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 21:59:50

xterro писал(а):унылое говно

О... безусловно... это ещё один: "весомый аргумент"... assert() и halt() Вам в помощь.

xterro писал(а):собственно для этого и создавались высокоуровневые языки

Однако, в высокоуровневых языках, всё таки оставили GoTo. Странные эти программисты.
Зачем оставили, если GoTo - страшное зло?

скалогрыз писал(а):если ты сам начал использовать goto, ты морально разрешаешь другим людям


В общем если не прыгать внутрь цикла, то пока что, сбоев мной не обнаружено. Верно?
Но никому не рекомендую использовать GoTo, т.к. это религия, которую трогать нельзя.
Всем кто прочитает: никогда не пользуйтесь GoTo!!!, потому что, до "большого взрыва" Вселенной не существовало...
Аминь?


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение скалогрыз » 01.09.2015 22:14:22

vitaly_l писал(а):В общем если не прыгать внутрь цикла, то пока что, сбоев мной не обнаружено. Верно?

Верно.
Но потенциально могут всплыть в комбинации с оптимизатором.
Хотя скорей всего, как раз не всплывут! потому что оптимизатор увидев goto решит, что "лучше ничего не трогать" оставив код как есть (не самым быстрым и не самым эффективным, каким потенциально мог бы быть).

vitaly_l писал(а):Но никому не рекомендую использовать GoTo, т.к. это религия, которую трогать нельзя.

На самом деле, религия здесь другая. Для использование goto, точно так же как и для вождения машины, следует сдавать на права :)
Ту же историю можно услышать например, про использование указателей.
Или глобальных переменных.
Или про вызов ProcessMessages.
Или, во вселенной sql, про курсоры и триггеры.
...ну и в каждой сфере есть свои инструменты, которые жизнь могут как облегчить, так и свести к нулю.

По-этому, я лично, советую тебе не стесняться использовать goto!
Ибо считаю право каждого человека на простреленную ногу святым.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 22:26:41

скалогрыз писал(а):Ибо считаю право каждого человека на простреленную ногу святым.

Спасибо, Вы добры как святой ! И реальное спасибо Вам и всем, за все разъяснения.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение Mirage » 02.09.2015 00:24:44

vitaly_l писал(а): :?: Например в примере sign - мне непонятно, чем появление под-процедур - упростило отладку? ( отладка в моём понимании может сильно отличаться от вашей отладки, поймите правильно я программист "инопланетянин", мне нужно реальное неоспоримое доказательство )


Ну, если "отладка" это последовательное нажатие F7, то да, непонятно чем с процедурами лучше.
Но обычно, под отладкой понимается просто чтение кода с попыткой понять что не так. А до пошаговой дело редко доходит, т.к. времязатратна она и не всегда возможна.
Тут вариант с процедурами уже куда лучше, особенно если им дать понятные названия.
Потому что когда видишь вызов процедуры, то понятно, что он делает. Часто даже просто по названию. Переходим к следующему оператору.
А если видишь GOTO, то фиг знает куда оно пойдет и что будет делать. Надо идти следом.

Поэтому не люблю не только GOTO, но и всякие BREAK, CONTINUE, EXIT в середине процедуры и т.п.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24

Рейтинг@Mail.ru