Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Голосования _ Goto

Автор: mamont001 17.12.2006 2:03

всегда хотел узнать как кто относится smile.gif

Автор: Bokul 17.12.2006 2:04

Цитата
не пользуюсь


Автор: volvo 17.12.2006 2:07

Не голосовал, ибо не нашел подходящего варианта: использую, но очень редко ...

Автор: Bokul 17.12.2006 2:13

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

Автор: Altair 17.12.2006 4:07

Цитата
Не голосовал, ибо не нашел подходящего варианта: использую, но очень редко ...

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

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

Автор: Michael_Rybak 17.12.2006 5:36

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

Чего, нормальные себе варианты имо smile.gif

Автор: мисс_граффити 20.12.2006 5:51

было дело - использовала. в QBasic'е...
а потом как-то необходимости не возникало.

Автор: Lapp 20.12.2006 12:38

Как в программировании, так и в обычной жизни "посылаю на" очень редко.. smile.gif
Уж и не припомню, когда... Но допускаю, что это может потребоваться либо для минимизации кода, либо для оптимизации программы.
Было бы интересно привести пример кода, где это оправдано. Но я с ходу пример не приведу..
Может, volvo?..

Автор: hiv 20.12.2006 15:05

Цитата(Altair @ 17.12.2006 0:07) *
Я бы даже сказал не использую Goto вообще, но иногда использую конструкции выхода exit (exit sub, return, braek и т.п.) в зависимости от языка.
Абсолютно согласен yes2.gif

Автор: SKVOZNJAK 26.12.2006 17:47

Цитата(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 26.12.2006 18:09

Не пользуюсь, т.к. если программа более менее обьемная, то её отладка превращается в кошмар

Автор: Altair 26.12.2006 20:15

Цитата
Ушедшие от нас старожилы форума вспомни ли бы что таковая электронная живность в изобилии водится у Сквозняка smile.gif

Я хотел написать, если бы Сквозной появлялся бы почаще...
А то не поймешь - придет еще или нет..

Автор: SKVOZNJAK 28.12.2006 16:53

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

Автор: hardcase 21.01.2007 22:21

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

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

Хотя ещё Дейкстра предлагал использовать GOTO для выхода из нескольких вложенных циклов..... Но я предпочитаю выбрасывать исключения.

Автор: Archon 22.01.2007 7:23

Когда впервые услышал, что использование goto, мягко говоря, "не приветствуется", очень удивился. Дескать, как же без него то, родимого... Оказалось можно. smile.gif
Кстати, когда в детстве программировал на QBasic'е, всегда мечтал, чтобы можно было метку задавать строкой. rolleyes.gif

Автор: xds 22.01.2007 9:37

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

Вот из поздних поделок (тогда я уже давно слез с QBasic и делал это кому-то на заказ): Прикрепленный файл  menu.zip ( 2.52 килобайт ) Кол-во скачиваний: 692


А вообще, на Quick Basic (синтаксис совпадает с QBasic, немного другая среда и есть возможность компиляции) был написан MicroCap 3.0, на моей XT (несмотря на её "турбовость" - 20 МГц!) он еле ворочался (при симуляции симметричного мультивибратора можно было спокойно идти мыться, а потом чаёвничать) !smoke2.gif

Автор: Archon 22.01.2007 16:00

Цитата
В QBasic можно и метки символические...
Не-а smile.gif В смысле чтоб так:
Код
metka1$ = "label" + num$
GOTO metka1$

Автор: SKVOZNJAK 24.01.2007 3:11

Это просто анархия получается. Если такое скомпилировать, то код может получиться неэффективным.

Автор: Archon 24.01.2007 4:39

Кстати, это было реализовано в одном из эзотерических языков.

Автор: SKVOZNJAK 24.01.2007 4:51

Я не против гото, очень даже за, но такой сильный инструмент нужно использовать упорядоченно. Выработать для себя правила применения и стараться их не нарушать.

Автор: xds 24.01.2007 10:05

Цитата
Это просто анархия получается. Если такое скомпилировать, то код может получиться неэффективным.
Такие приёмы обычно реализуются в языках, изначально ориентированных на интерпретацию. Например, в PHP можно вызывать функции по имени из переменной. В SOS Basic можно делать "GO TO n", где n - переменная, хранящая номер строки, к которой "GO". Правда, последнее черевато большими проблемами после автоматической перенумерации строк - как пить дать, поленится разбираться в Ваших формулах, вычисляющих адрес перехода smile.gif

Автор: hardcase 25.01.2007 0:26

Goto вполне применим. Только конструкции типа if, while, for и др. всё же не зря придумали.
В любом случае программу с goto можно преобразовать в форму из одних только циклов и ветвлений. К тому же оптимизация от использования сего оператора весьма сомнительна ввиду испоользования современных компиляторов.

Автор: SKVOZNJAK 5.02.2007 7:06

if и for никто и не выбрасывает, это же основа структурного кода. А вот while при использовании goto забываешь как пишется. Соблазн goto в халявных ресурсах алгоритма при добавлении кода. Не нужно переделывать алгоритм, втавляй сколько хочешь без подробного изучения всего участка кода.
Что происходит при выходе через goto из цикла или конструкции begin end и последующим в них возращением. Всё продолжает работать как если бы это был простой вызов процедуры. Сколько таких последовательных выходов компилятор способен запомнить?

Автор: klem4 12.02.2007 0:04

crazy.gif

Прикрепленное изображение

Автор: TarasBer 12.02.2007 1:51

Я всегда использую гото в процедуре считывания файла (в остальных случаях - очень редко).
Пример (надуманный): надо считать файл. В нём имеются: числа икс и игрик - по одному байту (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 17.02.2007 1:33

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

Автор: TarasBer 17.02.2007 22:36

Цитата(SKVOZNJAK @ 16.02.2007 21:33) *

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

И поможет? Мы ж не знаем вообще сколько надо считать байтов. Всё, что надо читать мы узнаём по ходу дела... И какая разница, типизирован ли файл, не понимаю...

Автор: SKVOZNJAK 19.02.2007 3:04

Смотря что считать помощью smile.gif Просто по жизни пользуюсь нетипизированными файлами, там без гото крокодил не ловится. Интересно было взглянуть, насколько вырастет количество меток у независимого эксперта.

Автор: Game-lord 26.05.2007 17:32

Пользуюсь, но очень редко =)

Автор: andriano 26.12.2007 3:08

Вопрс можно?
Спасибо.
А jmp @label за goto считается? ;)

А если серьезно, использовал на Фортране из соображений совместимости с FORTRAN IV до тех пор, пока не стало ясно, что уже никогда не буду пользоваться компиляторами, не поддерживающими по крайней мере Fortran 77.
Если же речь идет о Паскале, то, думаю, даже не вспомню, как синтаксически правильно описать метку.

Автор: Yevgeny 20.01.2008 5:36

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


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

Автор: Айра 21.01.2008 19:57

"Квалификация программиста обратна пропорциональна количеству операторов перехода, которые он использует в своих программах" - наш декан.. Я в принципе согласна..

Автор: Michael_Rybak 21.01.2008 20:26

Цитата
Квалификация программиста обратна пропорциональна количеству операторов перехода


То есть все программисты на питоне - одинаковой квалифиции lol.gif

Автор: Айра 21.01.2008 20:40

вообще это относилось к паскалю.. smile.gif

Автор: Michael_Rybak 21.01.2008 21:02

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

Автор: Айра 22.01.2008 9:40

Ну на то это и голосование, у каждого свое мнение))

Автор: andriano 24.01.2008 3:24

Цитата(Michael_Rybak @ 21.01.2008 17:02) *

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

"Любом" - подразумеваются все 7 пунктов опроса?

Автор: Айра 24.01.2008 9:16

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

Автор: andriano 24.01.2008 13:16

Цитата(Айра @ 24.01.2008 5:16) *

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

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

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