GOTO! Куда-куда?

Автор VlhOwn, 25 января 2011, 16:34

0 Пользователи и 1 гость просматривают эту тему.

convas

Цитата: dr.Faust от 26 января 2011, 02:04
Цитата: convas от 25 января 2011, 15:35Чем Вы предлагаете заменить конструкцию?On Error GoTo
Никакого отношения к GoTo не имеет.

GOTO он и в Африке GOTO.
В конструкции On Error GoTo ... этот GOTO используется также, как и во всех остальных случаях - для безусловного перехода.
И компилятор его преобразует в ассемблерный JMP, и GOTO, кстати, просто "бейсиковый" аналог JMP.
Просто On Error специфичен - он анализирует весь последующий код на предмет возникновения ошибок ("исключений").

И если в некоторых языках (ну уж очень старых) не было других возможностей для выхода из "навороченных" конструкций, то это не недостаток GOTO, а недоделки самого языка.

Ну и ссылка на подробности об GOTO:
http://ru.wikipedia.org/wiki/GOTO

bormant

Цитата: convas от 26 января 2011, 09:04В конструкции On Error GoTo ... этот GOTO используется также, как и во всех остальных случаях - для безусловного перехода.
Ну-ну, безусловного... Настолько же безусловного, как в if (условие) then goto :)
Только условием является возникновение нештатной ситуации, а выходом из on error блока может быть resume, resume next, или отказ от обработки на текущем уровне, то есть, повтор оператора, вызвавшего сбой, пропуск такого оператора или передача ошибки обработчику вверх по иерархии; то есть, возврат управления в предсказуемую точку. С этой точки зрения неважно, что написано после On Error -- goto, call, ..., поскольку контекст перехода/возврата сохраняется, в отличие от.
Автору на яд. Поддержать форум.

convas

if (условие) then goto
On Error GoTo

И в том, и в другом случае GOTO - оператор безусловного перехода.
В том смысле, что это свойство самого оператора, а не предшествующего ему условия.

GOTO используется и без условия, и с условием.

Только от использования GOTO с условием он не становится "условным" оператором.

bormant

В первом -- да, во втором -- нет.
Во втором -- это вообще не оператор (сюрприз!), а часть синтаксической конструкции On Error :)
On Error { Resume Next | Goto { метка | 0} }

Хотите опровергнуть -- подставьте в On Error что нибудь, кроме вышепоказанного.
Автору на яд. Поддержать форум.

convas

ЦитироватьХотите опровергнуть -- подставьте в On Error что нибудь, кроме вышепоказанного.

А зачем, я же не про On Error.

Ну, On Error может использовать только 2 оператора: или Resume Next, или Goto.

И что?

convas

#20
Вот тут всплыл вопрос о возможности ввалиться в цикл по GOTO:
http://forumooo.ru/index.php/topic,1257.msg9775/topicseen.html#msg9775

Так с помощью On Error GoTo ... это тоже легко делается, с всеми вытекающими...

Проблема GOTO метка - это не проблема GOTO. а проблема метки.

Метку можно вставить куда угодно в тело программы, и это дает очень мощное средство.

Но и налагает серьезную ответственность на программиста - надо очень хорошо подумать, прежде чем это использовать.

VlhOwn

Цитата: convas от 26 января 2011, 10:23Метку можно вставить куда угодно в тело программы, и это дает очень мощное средство.
А можете объяснить внятно, в чем, собственно, мощь?

По моему скромному мнению, само наличие GOTO в языке объясняется только а) историческим наследием и б) ущербностью самого языка.
Вот, в Алголе-68, например, или в автокоде Эльбрус обработка исключительных ситуаций доведена до логического совершенства (различаются динамические (контекст возникновения) и статические (контекст описания) ситуации, есть иерархия ситуаций, есть возможность описывать ситуации и т.д.), и в этих языках нет необходимости в конструкции On Error GOTO, как, впрочем, и в иных употреблениях GOTO.

convas

Я не фанатичный приверженец использования GOTO, но если его использование упрощает программу (особенно при отладке), я его использую и не считаю это зазорным, вместо того, чтобы громоздить многоэтажные конструкции.

Я (а может быть только я) считаю его мощным средством, но своего мнения никому не навязываю.

JohnSUN

(Это ответ на вопрос в первоначальной ветке. Лучше здесь, чтобы не мусорить)
Ничего, если я на псевдокоде? Лень бэйсик открывать...

... получить текущую книгу, запомнить текущий лист...
Сбросить флаг
Для каждого листа текущей книги
    Получить последнюю используемую ячейку
    От нее выделить диапазон на <константа> строк вверх с первого столбца (реально это пачка строк с присвоениями значений в структуре адреса)
    Смещением на одну строку вниз от верхней левой получить адрес целевой ячейки (проще всего еще пачка присвоений)
    Скопировать диапазон (типа, вставить строку с копированием данных и форматирования)
ВОТ_ТУТ_ВОШЛИ:
    Установить пачку уникальных значений в новой строке
    Чего-то поменять в сдвинутом диапазоне
    Что-то из значений запомнить
    Если флаг взведен
         Запомненное значение нормально?
             Тогда выскочить из цикла GOTO ПРОДОЛЖАЕМ_РАЗГОВОР
             Иначе  выскочить из цикла GOTO ЕГГОГ
    Переместить курсор в пятую ячейку
Конец цикла
Вернуться на текущий лист
С учетом запомненных в цикле значений что-то пересчитать
Взвести флаг
GOTO Внутрь цикла на ВОТ_ТУТ_ВОШЛИ
ПРОДОЛЖАЕМ_РАЗГОВОР:
... Еще что-то сделали
Выход
ЕГГОГ:
... рассказываем свое мнение о таких данных в книге

Уже предвкушаю какими словами мне станут рассказывать, что это делается вынесением фрагмента кода в процедуру и ее повторным вызовом вместо запутывания всей китайской разведки  ;D
А если у меня сейчас именно такая задача стоит - и программу написать и если гонорара не будет, чтоб клиент-жадина не сильно резвился?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

VlhOwn

convas, я тоже не возвожу неиспользование GOTO в основной принцип существования.
И я, признаться, уже лет 20 не программирую систематически, но достаточно регулярно пишу скрипты, а последние три года еще помогаю детям учиться на мехмате. Так вот, насколько я помню, за последние лет 5, скажем, мне ни разу не понадобился goto. Не потому, что я не желаю его использовать, а просто - не понадобился, потребности в нем не возникло.
А нет, вру, понадобился - когда выяснилось, что в VBS нет оператора continue. С тех пор предпочитаю javascript.

dr.Faust

Цитата: VlhOwn от 26 января 2011, 13:46А нет, вру, понадобился - когда выяснилось, что в VBS нет оператора continue.
А для чего он нужен?


Цитата: VlhOwn от 26 января 2011, 13:46за последние лет 5, скажем, мне ни разу не понадобился goto
Очень удобно, когда нет возможность закоментировать блок кода (да в том же OOoBasic) и какого-нибудь ": <<" тоже нет, обходить временно блоки кода во время отладки.
Свобода информации - свобода личности!

VlhOwn

Оператор continue используется для "досрочного" завершения шага цикла. Ну, например, когда нужно обрабатывать лишь те данные из набора, которые удовлетворяют определенным условиям. Можно, конечно, if-ов нагородить, но мое представление об эстетике тут встает на дыбы.

Саш, отладочные костыли - не программирование. Это мера временная, в коде не остающаяся. На ООо Basic я, увы (или ура!), не пишу, а с другими языками, где нельзя закомментировать код, я не сталкивался.

convas

Справочник по операторам C# (MS Visual Studio 2010) с примерами:

goto
http://msdn.microsoft.com/ru-ru/library/13940fs2.aspx

continue
http://msdn.microsoft.com/ru-ru/library/923ahwt1.aspx

и т.д.

prof-alex

Цитата: convas от 27 января 2011, 00:17
Справочник по операторам ...
А вот и реклама "Империи Зла" с её псевдомногоплатформной дотнет!

«Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации» Э. Дейкстра

dr.Faust

Цитата: VlhOwn от 26 января 2011, 21:45Можно, конечно, if-ов нагородить, но мое представление об эстетике тут встает на дыбы.
Хм... А что плохого то в if-ах?

Цитата: VlhOwn от 26 января 2011, 21:45отладочные костыли - не программирование. Это мера временная, в коде не остающаяся.
Ой, ли...

Цитата: VlhOwn от 26 января 2011, 21:45На ООо Basic я, увы (или ура!), не пишу, а с другими языками, где нельзя закомментировать код, я не сталкивался.
Ну так это не от языка зависит, а от редактора.

Цитата: convas от 26 января 2011, 22:17Справочник по операторам C#
C# и прочие Javы не нужны.
Свобода информации - свобода личности!