Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Пытливый on October 08, 2017, 11:12:35 PM
-
Странная ситуация, не пойму почему код работает правильно. :)
В общем не получилось с рекурсией, я попробовал сделать это иным способом:
ArrPush($AActionName, "Город")
ArrPush($AActionName, "Таверна")
ArrPush($AActionName, 100)
ArrPush($AActionName, 100)
ArrPush($AActionName, "Таверна")
ArrPush($AActionName, "Окорок")
ArrPush($AActionName, 10)
ArrPush($AActionName, 10)
sub(Activate, $ActionName)
EnterToSubActivate:
print($ActionName)
$ActionIndex = 0
$ActionRecognized = 1
while (($ActionRecognized = 1) & ($ActionIndex < ArrSize($AActionName)/4))
if ($AActionName[$ActionIndex*4+1] = $ActionName)
$ActionRecognized = 0
ArrPush($ActivateVar, $ActionName)
ArrPush($ActivateVar, $ActionIndex)
ArrPush($ActivateVar, $ActionRecognized)
$ActionName = $AActionName[$ActionIndex*4]
Goto(EnterToSubActivate)
ExitFromSubActivate:
$ActionRecognized = ArrPop($ActivateVar)
$ActionIndex = ArrPop($ActivateVar)
$ActionName = ArrPop($ActivateVar)
Move($AActionName[$ActionIndex*4+2], $AActionName[$ActionIndex*4+3])
LClick(-1, -1)
else
Inc($ActionIndex)
end_if
end_cyc
Goto(ExitFromSubActivate)
end_sub
print("Start")
Activate("Окорок")
print("Finish")
Я не пойму, почему код у меня завершается?
Инструкция Goto(ExitFromSubActivate) должна в вечный цикл загонять код, но нет, все завершается вполне пристойно. ???
По ошибке внутренней что-ли?
-
Потому... что выпрыгивать и впрыгивать в цикл по GOTO плохая идея.
Ты зашёл в известную тему, но благодаря удачливости зашёл с другого конца. Обычно происходит наоборот :) ;D
http://crapware.aidf.org/forum/index.php?topic=3429.msg23483#msg23483
Что у тебя? Да всё то же самое. После того как ты вышел из цикла while и добрался до GOTO (стр. 35) на вершине стека как раз оказывается адрес возврата из подпрограммы. Если бы не GOTO end_sub снял бы этот адрес с вершины и вернулся бы куда положено.
Но через Goto ты продлил ему агонию направив внутрь цикла минуя начало. Выполнились строки 25-30 и выполнение дошло до end_cyc. Который должен снять с вершины стека адрес начала цикла и перейти туда (ведь работают окончания почти одинаково), но на вершине стека нет никакого адреса начала цикла, там только упомянутый выше возврат из подпрограммы. Вот туда нас судьба и выбрасывает.
Даже если для тебя сейчас это хорошо и "так и нужно", лучше перепиши по нормальному и так не делай никогда.
Пока скрипт как этот из 40 строк найти причину такого поведения не сложно. Когда скрипт будет в 3000 строк и такие выкрутасы будут в нём повсеместно... ну ты понял. Ты не сможешь быть ни в чём уверен, не зная куда тебя телепортирует в очередном месте.
-
Что так делать "стремно" я понимаю, но вот как сделать иначе не могу сообразить, уж очень сильно я в рекурсию "врос". То что код сработал как хотелось бы, а не как ожидаемо - не мой стиль, поэтому я и задал вопрос. :) Как курьез его можно использовать, но ни в коем случае как готовое решение.