Помощь - Поиск - Пользователи - Календарь
Полная версия: Goto
Форум «Всё о Паскале» > Другое > Голосования
mamont001
всегда хотел узнать как кто относится smile.gif
Bokul
Цитата
не пользуюсь

volvo
Не голосовал, ибо не нашел подходящего варианта: использую, но очень редко ...
Bokul
Три этапа в развитии программиста:
Чайник - без Goto не куда;
Понимающий - не использую;
Профи - использую, но очень редко.
smile.gif
Altair
Цитата
Не голосовал, ибо не нашел подходящего варианта: использую, но очень редко ...

Полностью согласен.
Я бы даже сказал не использую Goto вообще, но иногда использую конструкции выхода exit (exit sub, return, braek и т.п.) в зависимости от языка, что в принципе является аналогом "goto end", т.к. перехода к конце программы\подпрограммы.

p.s. Варианты ответа для детского сада aka "реальных" хакеров.
Michael_Rybak
Цитата
p.s. Варианты ответа для детского сада aka "реальных" хакеров.

Чего, нормальные себе варианты имо smile.gif
мисс_граффити
было дело - использовала. в QBasic'е...
а потом как-то необходимости не возникало.
Lapp
Как в программировании, так и в обычной жизни "посылаю на" очень редко.. smile.gif
Уж и не припомню, когда... Но допускаю, что это может потребоваться либо для минимизации кода, либо для оптимизации программы.
Было бы интересно привести пример кода, где это оправдано. Но я с ходу пример не приведу..
Может, volvo?..
hiv
Цитата(Altair @ 17.12.2006 0:07) *
Я бы даже сказал не использую Goto вообще, но иногда использую конструкции выхода exit (exit sub, return, braek и т.п.) в зависимости от языка.
Абсолютно согласен yes2.gif
SKVOZNJAK
Цитата(Lapp @ 20.12.2006 5:38) *

Было бы интересно привести пример кода, где это оправдано. Но я с ходу пример не приведу..
Может, volvo?..

Ушедшие от нас старожилы форума вспомни ли бы что таковая электронная живность в изобилии водится у Сквозняка smile.gif
Первый пример. Очистка событий нажатия клавиш и мышки. Ось реально многозадачная, так что события могут подаваться порциями, а размер буфера - вопрос конечно интересный. Обоснование применения гото: зачем красивый код портить, мне за это никто не заплатит wink.gif


PROCEDURE BUF20(Z3: BYTE); {Ћ—?‘’ЉЂ Ѓ“”…ђЂ Љ‹Ђ‚›}
LABEL 1;
BEGIN
IF Z3<>0 THEN DELAY(Z3*100);
{FOR Z3:=1 TO 20 DO IF KEYPRESSED=TRUE THEN ReadKey;}
1:
SDL_PumpEvents;
if (SDL_PollEvent(event)>0) then begin
CASE event^.eventtype OF
SDL_KEYDOWN, SDL_MOUSEBUTTONDOWN : goto 1;
end;
end;
DELAY(25);
SDL_PumpEvents;
if (SDL_PollEvent(event)>0) then begin
CASE event^.eventtype OF
SDL_KEYDOWN, SDL_MOUSEBUTTONDOWN : goto 1;
end;
end;
END;

Ещё одна процедура из той же проги. Менюшка. Благодаря использованию гото всё уместилось в одну процедуру без дробления. Налицо инкапсуляция данных. Если так использовать goto с case то это уже не совсем уже тот безусловный переход о вреде которого предупреждам минздрав. Код процедуры используется многократно и с разными значениями. Если этот процесс автоматизировать, получим элемент ИИ. Программа сможет делать то, чему программист её не учил. Но результат такого действия не обязательно устроит человека.

PROCEDURE SINJKA; {Њ…Ќћ ‘?ЌњЉ?}
VAR AAA: ARRAY[1..7] OF STRING;
AA1: STRING;
Q3,W3,E3,R3,SINIJ,FLAG1,FLAG2: BYTE;
CONST IKS=18; IGREK=10;
LABEL 1,2,3,4,100;
BEGIN
SINIJ:=SINIUK;
AAA[1]:=' ';
AAA[2]:=' ЙННННННН ‘?ЌћЉ Ћ„?ЌЌЂ„–Ђ’ЋѓЋ ННННННН» ';
AAA[3]:=' є 255 є ';
AAA[4]:=' є 254 є ';
AAA[5]:=' є 253 є ';
AAA[6]:=' є 252 є ';
AAA[7]:=' ИНННННННННННННННННННННННННННННННННННј ';

E3:=1;
FOR W3:=IGREK TO IGREK+7 DO BEGIN
AA1:=AAA[E3];
R3:=1;
FOR Q3:=IKS TO IKS+ORD(AA1[0])-1 DO BEGIN
BUKVA(Q3,W3,ORD(AA1[R3]),11,1);
INC(R3);
END;
INC(E3);
IF E3=8 THEN E3:=1;
END;
{‚›•Ћ„ ‘?Њ‚Ћ‹Ђ ЌЂ ќЉђЂЌ - ЏЋ‡?–?џ ЏЋ
ѓЋђ?‡ЋЌ’Ђ‹?, ‚…ђ’?ЉЂ‹?, ЌЋЊ…ђ ‘?Њ‚Ћ‹Ђ, –‚…’ ˜ђ?”’Ђ, –‚…’ ”ЋЌЂ}
FLAG1:=1;
FLAG2:=0;

1:
W3:=2+IGREK+(255-SINIJ);
AA1:=AAA[3+(255-SINIJ)];
R3:=5;
FOR Q3:=IKS+4 TO IKS+ORD(AA1[0])-5 DO BEGIN
IF FLAG1=1 THEN
BUKVA(Q3,W3,ORD(AA1[R3]),10,0) ELSE
BUKVA(Q3,W3,ORD(AA1[R3]),11,1);
INC(R3);
END;
SDL_UpdateRect (screen,0,0,0,0);
CASE FLAG2 OF
3: BEGIN FLAG2:=0; GOTO 3; END;
4: BEGIN FLAG2:=0; GOTO 4; END;
END;

BUF20(1);
2:
SDL_PumpEvents;
if (SDL_PollEvent(event) > 0) then
begin
CASE event^.eventtype OF
SDL_MOUSEBUTTONDOWN : goto 100;
SDL_KEYDOWN: CASE EVENT^.KEY.keysym.SYM OF
SDLK_ESCAPE: GOTO 100;
SDLK_UP: BEGIN
FLAG1:=2;
FLAG2:=3;
GOTO 1;
3: FLAG1:=1;
IF SINIJ<>255 THEN INC(SINIJ);
GOTO 1;
END;
SDLK_DOWN: BEGIN
FLAG1:=2;
FLAG2:=4;
GOTO 1;
4: FLAG1:=1;
IF SINIJ<>252 THEN DEC(SINIJ);
GOTO 1;
END;
SDLK_KP_ENTER,SDLK_RETURN: BEGIN
SINIUK:=SINIJ;
CVET16[11]:=SDL_MapRGB(screen^.format,KRASNIUK,84,SINIUK);
GOTO 100;
END;
END;
END;
END;
GOTO 2;
100:
END;


И третье, самое козырное обоснование. История использования гото насчитывает не одну сотню лет. Даже не знавшие письменности крестьяне смогли осознать его необходимость. Вспомните: приехал Илья Муромец к камню, прочитал надпись, поехал по первому адресу, совершил действие, вернулся, прочитал другую надпись и т. д. Налицо структура:

5:
case A of
1: goto 1;
2: goto 2;
3: goto 3;
4: goto 4;
end;

1:
A:=2;
.............
goto 5;
2:
A:=3;
.............
goto 5;
3:
A:=4;
.............
goto 5;
4:
............


Нигилистам математически доказавшим ненужность этого оператора ответ простой GOTO 0 tease.gif
sonic
Не пользуюсь, т.к. если программа более менее обьемная, то её отладка превращается в кошмар
Altair
Цитата
Ушедшие от нас старожилы форума вспомни ли бы что таковая электронная живность в изобилии водится у Сквозняка smile.gif

Я хотел написать, если бы Сквозной появлялся бы почаще...
А то не поймешь - придет еще или нет..
SKVOZNJAK
Долгое время почти не кодил, основы забывать стал. Плохо поддерживать разговор в таком режиме. А тут на линукс подсел и интерес к пасквилю разгорелся по новой. Вот только с поиском ответов на возникшие в процессе перехода вопросы на этом форуме было не очень. Всё-таки здесь народ больше на винде ездит. А я на ней в основном играю. Но ничего, с основными вопросами разобрался, теперь можно и пофлудить wink.gif
hardcase
Пример с 'менюшкой' поразил.
Давненько я лапшеобразного кода не видел..... Странно, но красоты совершенно не заметил, наверно у меня просто другие эстетические принципы. (назначение кода тоже осталось в тумане)

Использую GOTO только для устранения концевых рекурсий (и то - редко): переход на begin вместо рекурсивного вызова.
Обычно если вижу, что хочется поставить в тексте GOTO, то налицо ошибка построения алгоритма и приходится заново его пересматривать.

Хотя ещё Дейкстра предлагал использовать GOTO для выхода из нескольких вложенных циклов..... Но я предпочитаю выбрасывать исключения.
Archon
Когда впервые услышал, что использование goto, мягко говоря, "не приветствуется", очень удивился. Дескать, как же без него то, родимого... Оказалось можно. smile.gif
Кстати, когда в детстве программировал на QBasic'е, всегда мечтал, чтобы можно было метку задавать строкой. rolleyes.gif
xds
Цитата(Archon @ 22.01.2007 10:23) *
Кстати, когда в детстве программировал на QBasic'е, всегда мечтал, чтобы можно было метку задавать строкой. rolleyes.gif
В QBasic можно и метки символические, и IFы блочные, и подпрограммы с функциями в виде отдельных блоков. Только поначалу я этого тоже не знал - писал по аналогии с SOS Basic (нумерация строк, GO TO, DEF FN), потом перешёл на блочный синтаксис (символические метки, IF ... END IF, SUB, FUNCTION).

Вот из поздних поделок (тогда я уже давно слез с QBasic и делал это кому-то на заказ): Нажмите для просмотра прикрепленного файла

А вообще, на Quick Basic (синтаксис совпадает с QBasic, немного другая среда и есть возможность компиляции) был написан MicroCap 3.0, на моей XT (несмотря на её "турбовость" - 20 МГц!) он еле ворочался (при симуляции симметричного мультивибратора можно было спокойно идти мыться, а потом чаёвничать) !smoke2.gif
Archon
Цитата
В QBasic можно и метки символические...
Не-а smile.gif В смысле чтоб так:
Код
metka1$ = "label" + num$
GOTO metka1$
SKVOZNJAK
Это просто анархия получается. Если такое скомпилировать, то код может получиться неэффективным.
Archon
Кстати, это было реализовано в одном из эзотерических языков.
SKVOZNJAK
Я не против гото, очень даже за, но такой сильный инструмент нужно использовать упорядоченно. Выработать для себя правила применения и стараться их не нарушать.
xds
Цитата
Это просто анархия получается. Если такое скомпилировать, то код может получиться неэффективным.
Такие приёмы обычно реализуются в языках, изначально ориентированных на интерпретацию. Например, в PHP можно вызывать функции по имени из переменной. В SOS Basic можно делать "GO TO n", где n - переменная, хранящая номер строки, к которой "GO". Правда, последнее черевато большими проблемами после автоматической перенумерации строк - как пить дать, поленится разбираться в Ваших формулах, вычисляющих адрес перехода smile.gif
hardcase
Goto вполне применим. Только конструкции типа if, while, for и др. всё же не зря придумали.
В любом случае программу с goto можно преобразовать в форму из одних только циклов и ветвлений. К тому же оптимизация от использования сего оператора весьма сомнительна ввиду испоользования современных компиляторов.
SKVOZNJAK
if и for никто и не выбрасывает, это же основа структурного кода. А вот while при использовании goto забываешь как пишется. Соблазн goto в халявных ресурсах алгоритма при добавлении кода. Не нужно переделывать алгоритм, втавляй сколько хочешь без подробного изучения всего участка кода.
Что происходит при выходе через goto из цикла или конструкции begin end и последующим в них возращением. Всё продолжает работать как если бы это был простой вызов процедуры. Сколько таких последовательных выходов компилятор способен запомнить?
TarasBer
Я всегда использую гото в процедуре считывания файла (в остальных случаях - очень редко).
Пример (надуманный): надо считать файл. В нём имеются: числа икс и игрик - по одному байту (shortint), причёи оба должны быть по модулю не более 10. Далее - количество элементов некоторого массива (byte). Их не более чем 64. Далее - сами элементы. Причём все обязаны быть ненулевыми. Далее - число V (byte). Обязательно равно 128. Всё. Как я это бы реализовал:

...
function Load(FileName: string): boolean;
var
i: integer;
F: file of byte;
label
Bad;
begin
Assign(F, FileName);
i := IOResult;
Reset(F);
if IOResult <> 0 then
goto Bad;
Read(F, X);
if Abs(X) > 10 then
goto Bad;
Read(F, Y);
if Abs(Y) > 10 then
goto Bad;
Read(F, Count);
if Count > 64 then
goto Bad;
for i := 0 to Count - 1 do begin
Read(F, A[i]);
if A[i] = 0 then
goto Bad;
end;
Read(F, V);
if V <> 128 then
goto Bad;
Close(F);
Load := True;
Exit;
Bad:
Close(F);
Load := False;
end;
...



Это весьма примитивный случай. И никакого злоупотребления - всё очень логично и читабельно.
Можно вместо гото писать begin Close(F); Load := False; Exit; end; - но это дольше. А как этот текст выглядит в виде брек-континь, я даже думать не хочу. Так что без гото здесь можно обойтись лишь теоретически.
SKVOZNJAK
А теперь реши эту задачку открывая файл как нетипизованный.
TarasBer
Цитата(SKVOZNJAK @ 16.02.2007 21:33) *

А теперь реши эту задачку открывая файл как нетипизованный.

И поможет? Мы ж не знаем вообще сколько надо считать байтов. Всё, что надо читать мы узнаём по ходу дела... И какая разница, типизирован ли файл, не понимаю...
SKVOZNJAK
Смотря что считать помощью smile.gif Просто по жизни пользуюсь нетипизированными файлами, там без гото крокодил не ловится. Интересно было взглянуть, насколько вырастет количество меток у независимого эксперта.
Game-lord
Пользуюсь, но очень редко =)
andriano
Вопрс можно?
Спасибо.
А jmp @label за goto считается? ;)

А если серьезно, использовал на Фортране из соображений совместимости с FORTRAN IV до тех пор, пока не стало ясно, что уже никогда не буду пользоваться компиляторами, не поддерживающими по крайней мере Fortran 77.
Если же речь идет о Паскале, то, думаю, даже не вспомню, как синтаксически правильно описать метку.
Yevgeny
Сам почти не пользуюсь, но мой препод говорит, что хороший программист отличается от плохого тем, что у плохого есть Label, а у хорошего нет!
Сам я лично считаю, что именно в паскале это не так важно, ибо никакой уважающий себя программист в паскале ничего достойного писать не будет, а в смысле обучения хорошему стилю написания кода, так сказать для разминки, в самый раз, и никакие goto тут неприемлимы!!! klem4 суперрр картинка lol.gif


Уважаемый, volvo, я не хотел Вас обидеть таковым отношением к паскалю, я высказал всего-лишь своё личное мнение, никому его не навязывая, никого не обзывая и не ущемляя достоинство других, и хотя я считаю, что обосновал своё именно такое отношение, не говоря при этом что-то плохое... Свободу слова по-моему никто не отменял, и правил форума я не нарушил... Вы можете занижать мою репутацию на форуме сколько хотите, но ничего этим не добъётесь, ибо я на нём зарегистрировался отнюдь не для повышения своей репутации и не для моего самоутверждения, а для своего усовершенствования, для того что бы в будущем стать достойным программистом, конечно же знающим и паскаль в том числе...
Извините пожалуйста за сообщение не по теме!
Айра
"Квалификация программиста обратна пропорциональна количеству операторов перехода, которые он использует в своих программах" - наш декан.. Я в принципе согласна..
Michael_Rybak
Цитата
Квалификация программиста обратна пропорциональна количеству операторов перехода


То есть все программисты на питоне - одинаковой квалифиции lol.gif
Айра
вообще это относилось к паскалю.. smile.gif
Michael_Rybak
категорически несогласен в любом случае smile.gif
Айра
Ну на то это и голосование, у каждого свое мнение))
andriano
Цитата(Michael_Rybak @ 21.01.2008 17:02) *

категорически несогласен в любом случае smile.gif

"Любом" - подразумеваются все 7 пунктов опроса?
Айра
А по-моему, Michael_Rybak, отнес это к моим словам..
andriano
Цитата(Айра @ 24.01.2008 5:16) *

А по-моему, Michael_Rybak, отнес это к моим словам..

Вообще-то твой вариант (с уточнениями Михаила) в несколько обобщенной форме можно представить так:

W = k1*k2*k3*...*kn,
где:
W - квалификация программиста,
k1 = N/(Ngoto+1),
где:
N - количество строк кода программы,
Ngoto - количество операторов перехода.
k2 - ?
k3 - ?
...
kn - ?
Осталось только доопределить k2...kn. ;)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.