Не голосовал, ибо не нашел подходящего варианта: использую, но очень редко ...
Bokul
17.12.2006 2:13
Три этапа в развитии программиста: Чайник - без Goto не куда; Понимающий - не использую; Профи - использую, но очень редко.
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 "реальных" хакеров.
Чего, нормальные себе варианты имо
мисс_граффити
20.12.2006 5:51
было дело - использовала. в QBasic'е... а потом как-то необходимости не возникало.
Lapp
20.12.2006 12:38
Как в программировании, так и в обычной жизни "посылаю на" очень редко.. Уж и не припомню, когда... Но допускаю, что это может потребоваться либо для минимизации кода, либо для оптимизации программы. Было бы интересно привести пример кода, где это оправдано. Но я с ходу пример не приведу.. Может, volvo?..
hiv
20.12.2006 15:05
Цитата(Altair @ 17.12.2006 0:07)
Я бы даже сказал не использую Goto вообще, но иногда использую конструкции выхода exit (exit sub, return, braek и т.п.) в зависимости от языка.
Абсолютно согласен
SKVOZNJAK
26.12.2006 17:47
Цитата(Lapp @ 20.12.2006 5:38)
Было бы интересно привести пример кода, где это оправдано. Но я с ходу пример не приведу.. Может, volvo?..
Ушедшие от нас старожилы форума вспомни ли бы что таковая электронная живность в изобилии водится у Сквозняка Первый пример. Очистка событий нажатия клавиш и мышки. Ось реально многозадачная, так что события могут подаваться порциями, а размер буфера - вопрос конечно интересный. Обоснование применения гото: зачем красивый код портить, мне за это никто не заплатит
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;
Нигилистам математически доказавшим ненужность этого оператора ответ простой GOTO 0
sonic
26.12.2006 18:09
Не пользуюсь, т.к. если программа более менее обьемная, то её отладка превращается в кошмар
Altair
26.12.2006 20:15
Цитата
Ушедшие от нас старожилы форума вспомни ли бы что таковая электронная живность в изобилии водится у Сквозняка smile.gif
Я хотел написать, если бы Сквозной появлялся бы почаще... А то не поймешь - придет еще или нет..
SKVOZNJAK
28.12.2006 16:53
Долгое время почти не кодил, основы забывать стал. Плохо поддерживать разговор в таком режиме. А тут на линукс подсел и интерес к пасквилю разгорелся по новой. Вот только с поиском ответов на возникшие в процессе перехода вопросы на этом форуме было не очень. Всё-таки здесь народ больше на винде ездит. А я на ней в основном играю. Но ничего, с основными вопросами разобрался, теперь можно и пофлудить
hardcase
21.01.2007 22:21
Пример с 'менюшкой' поразил. Давненько я лапшеобразного кода не видел..... Странно, но красоты совершенно не заметил, наверно у меня просто другие эстетические принципы. (назначение кода тоже осталось в тумане)
Использую GOTO только для устранения концевых рекурсий (и то - редко): переход на begin вместо рекурсивного вызова. Обычно если вижу, что хочется поставить в тексте GOTO, то налицо ошибка построения алгоритма и приходится заново его пересматривать.
Хотя ещё Дейкстра предлагал использовать GOTO для выхода из нескольких вложенных циклов..... Но я предпочитаю выбрасывать исключения.
Archon
22.01.2007 7:23
Когда впервые услышал, что использование goto, мягко говоря, "не приветствуется", очень удивился. Дескать, как же без него то, родимого... Оказалось можно. Кстати, когда в детстве программировал на QBasic'е, всегда мечтал, чтобы можно было метку задавать строкой.
xds
22.01.2007 9:37
Цитата(Archon @ 22.01.2007 10:23)
Кстати, когда в детстве программировал на QBasic'е, всегда мечтал, чтобы можно было метку задавать строкой.
В QBasic можно и метки символические, и IFы блочные, и подпрограммы с функциями в виде отдельных блоков. Только поначалу я этого тоже не знал - писал по аналогии с SOS Basic (нумерация строк, GO TO, DEF FN), потом перешёл на блочный синтаксис (символические метки, IF ... END IF, SUB, FUNCTION).
А вообще, на Quick Basic (синтаксис совпадает с QBasic, немного другая среда и есть возможность компиляции) был написан MicroCap 3.0, на моей XT (несмотря на её "турбовость" - 20 МГц!) он еле ворочался (при симуляции симметричного мультивибратора можно было спокойно идти мыться, а потом чаёвничать)
Archon
22.01.2007 16:00
Цитата
В QBasic можно и метки символические...
Не-а В смысле чтоб так:
Код
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". Правда, последнее черевато большими проблемами после автоматической перенумерации строк - как пить дать, поленится разбираться в Ваших формулах, вычисляющих адрес перехода
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 и последующим в них возращением. Всё продолжает работать как если бы это был простой вызов процедуры. Сколько таких последовательных выходов компилятор способен запомнить?
Я всегда использую гото в процедуре считывания файла (в остальных случаях - очень редко). Пример (надуманный): надо считать файл. В нём имеются: числа икс и игрик - по одному байту (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
Смотря что считать помощью Просто по жизни пользуюсь нетипизированными файлами, там без гото крокодил не ловится. Интересно было взглянуть, насколько вырастет количество меток у независимого эксперта.
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 суперрр картинка
Уважаемый, volvo, я не хотел Вас обидеть таковым отношением к паскалю, я высказал всего-лишь своё личное мнение, никому его не навязывая, никого не обзывая и не ущемляя достоинство других, и хотя я считаю, что обосновал своё именно такое отношение, не говоря при этом что-то плохое... Свободу слова по-моему никто не отменял, и правил форума я не нарушил... Вы можете занижать мою репутацию на форуме сколько хотите, но ничего этим не добъётесь, ибо я на нём зарегистрировался отнюдь не для повышения своей репутации и не для моего самоутверждения, а для своего усовершенствования, для того что бы в будущем стать достойным программистом, конечно же знающим и паскаль в том числе... Извините пожалуйста за сообщение не по теме!
Айра
21.01.2008 19:57
"Квалификация программиста обратна пропорциональна количеству операторов перехода, которые он использует в своих программах" - наш декан.. Я в принципе согласна..
Michael_Rybak
21.01.2008 20:26
Цитата
Квалификация программиста обратна пропорциональна количеству операторов перехода
То есть все программисты на питоне - одинаковой квалифиции
Айра
21.01.2008 20:40
вообще это относилось к паскалю..
Michael_Rybak
21.01.2008 21:02
категорически несогласен в любом случае
Айра
22.01.2008 9:40
Ну на то это и голосование, у каждого свое мнение))
andriano
24.01.2008 3:24
Цитата(Michael_Rybak @ 21.01.2008 17:02)
категорически несогласен в любом случае
"Любом" - подразумеваются все 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. ;)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.