Как избежать использования goto???

Ask for help

Moderators: Murderator+, Murderator

Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Как избежать использования goto???

Post by Sanch »

Вобщем тк во всех скриптах goto выходит за пределы оборотов, что вызывает глюки, как написал йоко, написал новй скрипт, добавил его с остальным, а в нем все прально но из за непрального использования готу, глючат другие, подскажите че нить дельное плз, в основном готу я использую на проверку физла при касте.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Переписывай все скрипты.

Пример с GoTo

Code: Select all

sub main()
:start
if uo.injournal("Fizzle") then
goto Medit
endif
if uo.injournal("Successfully") then
goto Success
endif
:Cast
uo.deletejournal()
uo.cast("Magic Arrow","self")
wait(3000)
goto start
:Medit
uo.useskill("Meditation")
wait(5000)
goto Cast
:Success
uo.print("Magic Arrow successfully casted to self")
endsub


Пример без goto:

Code: Select all

sub main()
repeat
if uo.injournal("Fizzle") then
uo.useskill("Meditation")
wait(5000)
endif
uo.deletejournal()
uo.cast("Magic Arrow","self")
wait(3000)
until not uo.injournal("Successfully")
uo.print("Magic Arrow successfully casted to self")
endsub
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

Ща на ночь глядя мне что то не думается никак, у меня что то вроде, после каста, если физл, он переходит на опять првоерку маны и каст, мне интересна сама технолгия замены, тк имхо вещь оч удобная, но глючит, зарание благодарю.
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Sanch wrote:Ща на ночь глядя мне что то не думается никак, у меня что то вроде, после каста, если физл, он переходит на опять првоерку маны и каст, мне интересна сама технолгия замены, тк имхо вещь оч удобная, но глючит, зарание благодарю.


-=...ЫЫЫ...=-

Вобщем совет простой: просто навсегда забудь про goto и пиши все скрипты без него... поверь, это не сложно до всего самому догадатся...
{
использование циклов и процедурное программирование полностью исключают необходимость использования команды goto
}
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Sanch wrote:...имхо вещь оч удобная...

- ГЛУПОСТЬ, не говори это никому... просто засмеют :)
admir
Posts: 528
Joined: 2005-01-13 07:20:54

Post by admir »

у тебя стоит метка 1 ТУТ
скрипт
метка 2 ТУТ
скрипт
условие да на 2
условие да то на 1
(условие ,да -2 нет -1 )

как сделать цикл ...

while условие 1 {
..
while условие 2 {
..
}
}


=========
с 1 меткой

МЕТКА ТУТ
...
условие ДА - метка

while условие {
..
}

либо

repeat
..
until условие
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Der wrote:
Sanch wrote:...имхо вещь оч удобная...

- ГЛУПОСТЬ, не говори это никому... просто засмеют :)


Глупость не признавать удобства гоуту. Если бы он был не нужен - его не было бы в языке. При этом он есть во всех языках программирования. Другое дело - его неудобство для структурного программирования. Для чтения кода написанного скрипта. Для анализа логики этого скрипта. И т. д.

Именно поэтому гоуту стараются не использовать когда это возможно. Но если замена гоуту равнозначна введению сложной громоздкой структуры других операторов (иногда так бывает) - лучше использовать гоуту. Я думаю, примерно в 3-5% моих скриптов иногда используется гоуту, счас точно не помню, никогда не запоминал этого.

Гоуту можно использовать без опаски, соблюдая парочку несложных правил:
1. Не выходить по гоуту из функций и процедур наружу.
2. Не выходить из циклов (то есть while, repeat, for) за их пределы
Sanch
Posts: 308
Joined: 2005-07-17 15:30:52
Location: www.drw.ru

Post by Sanch »

1. Не выходить по гоуту из функций и процедур наружу.
2. Не выходить из циклов (то есть while, repeat, for) за их пределы


Все это я прочитал, до того как создать этот топ, но к сожалению после того как написал тучу криптов с применением готу, причем во всех скриптах он выходит за цыкл, и очередной скрипт написаный так, сделал так что в других скриптах он на готу начал ругаться, хотя до этого этого не случалось никогда, вобщем решил заменить готу, на repeat....until, тк у меня в скриптах готу применен пока только так.
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Харошь гнать :)
Не видел я в своей жизни еще таких ситуаций, гдеб вместо гоуту пришлось бы использовать какие-то сверхсложные условия...

А гоуту всегда можно заменить (без каких-либо сложностей) , если правильно пользоватся процедурами...
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Sanch wrote:
1. Не выходить по гоуту из функций и процедур наружу.
2. Не выходить из циклов (то есть while, repeat, for) за их пределы


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


А ты не лепи в циклы по многу действий... используй процедуры...
Разделяй алгоритм на блоки... Кароч, харошь гнать! ГОуТУ в отстой...
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Раздвоение личности?
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Der wrote:Харошь гнать :)
Не видел я в своей жизни еще таких ситуаций, гдеб вместо гоуту пришлось бы использовать какие-то сверхсложные условия...


Мало значит ты видел вообще ситуаций... Я с головы придумывать не буду, но подобные ситуации бывают. Железно. И вообще: чтобы оценивать что есть гоуту для скрипта, надо почитать как скриптовый модуль работает... Не знаю, есть ли у тебя такой файлик, но вот цитата:

Идея парсера

Собственно заключается в том, чтобы использовать Bison по максимуму. Единственное ограничение – Бизон рассчитан на написание компиляторов. То есть таких программ, в которых переданный скрипт просматривается целиком и притом всего один раз. У меня же интерпретатор. А в интерпретаторе, как известно, части скрипта могут вообще не выполняться (например, тело IF) или выполняться несколько раз (в случае цикла). Как я из этого выкручиваюсь?
Тупо. Бизон генерирует разборщик грамматики yyparse, который зависит от внешней функции yylex, сообщающей ему, какое именно слово требуется разобрать в дальнейшем. Так я в функции yylex вру что, например, в случае ложного условия IF тело до ENDIF пустое, а в случае цикла FOR a=1 to 10, тело цикла повторяется 10 раз.
Правда в этом случае пришлось функцию yylex сделать слишком «интеллектуальной»: она сама определяет, когда надо убрать строки, а когда наоборот. К счастью «добавление» лишних строк осуществляется простой установкой внутреннего указателя ScriptPos в соответствующую позицию (кстати, таким же образом реализован GoTo). А «удаление» строк сделано функциями SkipToEndIf, SkipToCR, SkipToElseOrEndif, SkipToWend и т.д. Их назначение ясно из названия.
Комментарии по тексту парсера находятся в myparser.h, по синтаксису в script.y.
Еще одно замечание. Главной частью парсера является класс TVariable, который, несмотря на название, хранит не только переменные, но и классы, массивы, а так же море внутренней информации используемой в основном внутри script.y


Так что как видишь, гоуту для скрипта не представляет в обработке каких-либо сложностей, не сложнее ифа.
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Вобщем, хороший программист никогда не использует команду goto... вот это железно.

А до парсера мне до лампочки что там и как работает... раз команда гоуту не может выводить из цикла она совершенно не нужна! Всё очень красиво реальзуется через процедуры...
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Grin wrote:Раздвоение личности?


Нет, просто так получилось... я имел ввиду что если замена гоуту на что то другое приводит к возникновению кучи условий вместо красивого алгоритма то это значит что у скриптописателя бардак в голове и пора пить пиво... :)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Der wrote:Вобщем, хороший программист никогда не использует команду goto... вот это железно.


Хороший программист старается не использовать команду гоуту. Потому что хороший программист пишет обычно большие скрипты, сложно структурированные, модульные, и хорошему программисту часто приходится залезать в эти скрипты и что-то изменять, совершенствовать, править. А команда гоуту затрудняет чтение такого скрипта. И все. Больше ничего. Все остальное - фантазии.

ЗЫ: скрипты = программы

ЗЗЫ: поверь моему двадцатилетнему (с лишком) опыту программирования. Я знал очень много высококлассных программеров. Да и сам когда-то был таким.
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Edred wrote:
Der wrote:Вобщем, хороший программист никогда не использует команду goto... вот это железно.


Хороший программист старается не использовать команду гоуту. Потому что хороший программист пишет обычно большие скрипты, сложно структурированные, модульные, и хорошему программисту часто приходится залезать в эти скрипты и что-то изменять, совершенствовать, править. А команда гоуту затрудняет чтение такого скрипта. И все. Больше ничего. Все остальное - фантазии.

ЗЫ: скрипты = программы

ЗЗЫ: поверь моему двадцатилетнему (с лишком) опыту программирования. Я знал очень много высококлассных программеров. Да и сам когда-то был таким.


Ой мля, нун@х с вами спорить... у меня Батя отличный программист, и когда я был маленький и он меня пытался научить программировать. Одно из первых что он мне сказал: "Про goto забудь раз и навсегда...
Вот так...
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Der wrote:
Edred wrote:
Der wrote:Вобщем, хороший программист никогда не использует команду goto... вот это железно.


Хороший программист старается не использовать команду гоуту. Потому что хороший программист пишет обычно большие скрипты, сложно структурированные, модульные, и хорошему программисту часто приходится залезать в эти скрипты и что-то изменять, совершенствовать, править. А команда гоуту затрудняет чтение такого скрипта. И все. Больше ничего. Все остальное - фантазии.

ЗЫ: скрипты = программы

ЗЗЫ: поверь моему двадцатилетнему (с лишком) опыту программирования. Я знал очень много высококлассных программеров. Да и сам когда-то был таким.


Ой мля, нун@х с вами спорить... у меня Батя отличный программист, и когда я был маленький и он меня пытался научить программировать. Одно из первых что он мне сказал: "Про goto забудь раз и навсегда...
Вот так...

Это в другом языке было :-D
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Да какая разница какой язык, да хоть BrainFuck!!! Хотя это уже совсем другая история :)
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

о да фак брен это классика;))) нравились мнетакие приколы;)))
нуапоповоду гоуту...
как и всем процесору свойственная ошибка;)) так вот существует такое понятие как проскок;)
в чем он проевляется то что указатель в памяти может быть неправельно выставлен... И что быэто исправитьидет проверкаиповторное выставление...так воткогда идетскачек на большие дистанцции проскокна иболее вероятен;) Но поверьте это не как не скажетсянавас и на ваших скриптах;) этоувсе уровни памитей процесса и другойдребедени;) все это относительно... гоуту обыкновеный без условныйпереход... только как как он выполнен в этом скриптовоммодуле... оставляет желать лутшего...
Вобщем это не повод длядраки...
flake
Expert!
Posts: 746
Joined: 2004-08-11 23:56:17
Location: The Citadel
Contact:

Post by flake »

Ну чтож.. я опять, побив рекорд (дойдя от вино-водочного магазина до кондиции за 2.5 минуты) полез постить на форуме.
Раньше (когда Цитадель работала) я постоянно использовал функции с GoTo. На крутого програмиста я не притендую, т.к. крмое инжекта я писал код только на уроках паскаля в 9 классе... Так вот, GoTo c выходом за приделы цыкла ни разу не выдавал ошибки ни у меня, ни у половина шарда, которые моими скриптами пользовались. Вот пример такого "кривого" GoTo:

Code: Select all

################# 
Sub medit()
#################
var xtime = 0
var mfail = "lose your concentration"
var mpeace = "You are at peace" 
  medit:
  DeleteJournal(mfail)
  DeleteJournal(mpeace)
  xtime = uo.timer()
  uo.warmode(0)
  uo.useskill( 'Meditation' )
    repeat
      if uo.injournal(mfail) then
        goto medit
      else
        wait(500)
      endif
    until UO.InJournal( 'You are at peace') OR (uo.timer() >= xtime + 1200)     
endsub
Post Reply