Как избежать использования goto???
Moderators: Murderator+, Murderator
-
- Posts: 308
- Joined: 2005-07-17 15:30:52
- Location: www.drw.ru
Как избежать использования goto???
Вобщем тк во всех скриптах goto выходит за пределы оборотов, что вызывает глюки, как написал йоко, написал новй скрипт, добавил его с остальным, а в нем все прально но из за непрального использования готу, глючат другие, подскажите че нить дельное плз, в основном готу я использую на проверку физла при касте.
-
- Junior Expert
- Posts: 3221
- Joined: 2004-06-24 22:08:56
Переписывай все скрипты.
Пример с GoTo
Пример без goto:
Пример с 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
-
- Posts: 308
- Joined: 2005-07-17 15:30:52
- Location: www.drw.ru
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
Sanch wrote:Ща на ночь глядя мне что то не думается никак, у меня что то вроде, после каста, если физл, он переходит на опять првоерку маны и каст, мне интересна сама технолгия замены, тк имхо вещь оч удобная, но глючит, зарание благодарю.
-=...ЫЫЫ...=-
Вобщем совет простой: просто навсегда забудь про goto и пиши все скрипты без него... поверь, это не сложно до всего самому догадатся...
{
}использование циклов и процедурное программирование полностью исключают необходимость использования команды goto
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
Der wrote:Sanch wrote:...имхо вещь оч удобная...
- ГЛУПОСТЬ, не говори это никому... просто засмеют
Глупость не признавать удобства гоуту. Если бы он был не нужен - его не было бы в языке. При этом он есть во всех языках программирования. Другое дело - его неудобство для структурного программирования. Для чтения кода написанного скрипта. Для анализа логики этого скрипта. И т. д.
Именно поэтому гоуту стараются не использовать когда это возможно. Но если замена гоуту равнозначна введению сложной громоздкой структуры других операторов (иногда так бывает) - лучше использовать гоуту. Я думаю, примерно в 3-5% моих скриптов иногда используется гоуту, счас точно не помню, никогда не запоминал этого.
Гоуту можно использовать без опаски, соблюдая парочку несложных правил:
1. Не выходить по гоуту из функций и процедур наружу.
2. Не выходить из циклов (то есть while, repeat, for) за их пределы
-
- Posts: 308
- Joined: 2005-07-17 15:30:52
- Location: www.drw.ru
1. Не выходить по гоуту из функций и процедур наружу.
2. Не выходить из циклов (то есть while, repeat, for) за их пределы
Все это я прочитал, до того как создать этот топ, но к сожалению после того как написал тучу криптов с применением готу, причем во всех скриптах он выходит за цыкл, и очередной скрипт написаный так, сделал так что в других скриптах он на готу начал ругаться, хотя до этого этого не случалось никогда, вобщем решил заменить готу, на repeat....until, тк у меня в скриптах готу применен пока только так.
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
Sanch wrote:1. Не выходить по гоуту из функций и процедур наружу.
2. Не выходить из циклов (то есть while, repeat, for) за их пределы
Все это я прочитал, до того как создать этот топ, но к сожалению после того как написал тучу криптов с применением готу, причем во всех скриптах он выходит за цыкл, и очередной скрипт написаный так, сделал так что в других скриптах он на готу начал ругаться, хотя до этого этого не случалось никогда, вобщем решил заменить готу, на repeat....until, тк у меня в скриптах готу применен пока только так.
А ты не лепи в циклы по многу действий... используй процедуры...
Разделяй алгоритм на блоки... Кароч, харошь гнать! ГОуТУ в отстой...
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
Так что как видишь, гоуту для скрипта не представляет в обработке каких-либо сложностей, не сложнее ифа.
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
Der wrote:Вобщем, хороший программист никогда не использует команду goto... вот это железно.
Хороший программист старается не использовать команду гоуту. Потому что хороший программист пишет обычно большие скрипты, сложно структурированные, модульные, и хорошему программисту часто приходится залезать в эти скрипты и что-то изменять, совершенствовать, править. А команда гоуту затрудняет чтение такого скрипта. И все. Больше ничего. Все остальное - фантазии.
ЗЫ: скрипты = программы
ЗЗЫ: поверь моему двадцатилетнему (с лишком) опыту программирования. Я знал очень много высококлассных программеров. Да и сам когда-то был таким.
-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
Edred wrote:Der wrote:Вобщем, хороший программист никогда не использует команду goto... вот это железно.
Хороший программист старается не использовать команду гоуту. Потому что хороший программист пишет обычно большие скрипты, сложно структурированные, модульные, и хорошему программисту часто приходится залезать в эти скрипты и что-то изменять, совершенствовать, править. А команда гоуту затрудняет чтение такого скрипта. И все. Больше ничего. Все остальное - фантазии.
ЗЫ: скрипты = программы
ЗЗЫ: поверь моему двадцатилетнему (с лишком) опыту программирования. Я знал очень много высококлассных программеров. Да и сам когда-то был таким.
Ой мля, нун@х с вами спорить... у меня Батя отличный программист, и когда я был маленький и он меня пытался научить программировать. Одно из первых что он мне сказал: "Про goto забудь раз и навсегда...
Вот так...
-
- Junior Expert
- Posts: 3221
- Joined: 2004-06-24 22:08:56
Der wrote:Edred wrote:Der wrote:Вобщем, хороший программист никогда не использует команду goto... вот это железно.
Хороший программист старается не использовать команду гоуту. Потому что хороший программист пишет обычно большие скрипты, сложно структурированные, модульные, и хорошему программисту часто приходится залезать в эти скрипты и что-то изменять, совершенствовать, править. А команда гоуту затрудняет чтение такого скрипта. И все. Больше ничего. Все остальное - фантазии.
ЗЫ: скрипты = программы
ЗЗЫ: поверь моему двадцатилетнему (с лишком) опыту программирования. Я знал очень много высококлассных программеров. Да и сам когда-то был таким.
Ой мля, нун@х с вами спорить... у меня Батя отличный программист, и когда я был маленький и он меня пытался научить программировать. Одно из первых что он мне сказал: "Про goto забудь раз и навсегда...
Вот так...
Это в другом языке было

-
- Expert!
- Posts: 1032
- Joined: 2006-02-25 21:48:38
о да фак брен это классика;))) нравились мнетакие приколы;)))
нуапоповоду гоуту...
как и всем процесору свойственная ошибка;)) так вот существует такое понятие как проскок;)
в чем он проевляется то что указатель в памяти может быть неправельно выставлен... И что быэто исправитьидет проверкаиповторное выставление...так воткогда идетскачек на большие дистанцции проскокна иболее вероятен;) Но поверьте это не как не скажетсянавас и на ваших скриптах;) этоувсе уровни памитей процесса и другойдребедени;) все это относительно... гоуту обыкновеный без условныйпереход... только как как он выполнен в этом скриптовоммодуле... оставляет желать лутшего...
Вобщем это не повод длядраки...
нуапоповоду гоуту...
как и всем процесору свойственная ошибка;)) так вот существует такое понятие как проскок;)
в чем он проевляется то что указатель в памяти может быть неправельно выставлен... И что быэто исправитьидет проверкаиповторное выставление...так воткогда идетскачек на большие дистанцции проскокна иболее вероятен;) Но поверьте это не как не скажетсянавас и на ваших скриптах;) этоувсе уровни памитей процесса и другойдребедени;) все это относительно... гоуту обыкновеный без условныйпереход... только как как он выполнен в этом скриптовоммодуле... оставляет желать лутшего...
Вобщем это не повод длядраки...
Ну чтож.. я опять, побив рекорд (дойдя от вино-водочного магазина до кондиции за 2.5 минуты) полез постить на форуме.
Раньше (когда Цитадель работала) я постоянно использовал функции с GoTo. На крутого програмиста я не притендую, т.к. крмое инжекта я писал код только на уроках паскаля в 9 классе... Так вот, GoTo c выходом за приделы цыкла ни разу не выдавал ошибки ни у меня, ни у половина шарда, которые моими скриптами пользовались. Вот пример такого "кривого" GoTo:
Раньше (когда Цитадель работала) я постоянно использовал функции с 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