Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: putman on December 21, 2016, 08:25:39 AM

Title: Подпрограммы.
Post by: putman on December 21, 2016, 08:25:39 AM
Здравствуйте.

Меня смутил выход из подпрограммы через GOTO.
Я захожу в неё, и по некоторому условию выхожу не через END_SUB.
Почему не происходит сбоя при повторном вызове этой, или другой подпрограммы ?
Разве адрес вызова первой стирается после любого выхода из тела даже по GOTO ?
Title: Re: Подпрограммы.
Post by: Vint on December 21, 2016, 09:32:13 AM
Тебя смущает, а ты всё равно выходишь. Мыши кололись...
И никто не разрешал так выходить, но и защиты "от дурака" не встроено.

Сбои происходят при определённых условиях. Могу пример показать. Но зачем? Сказано же нельзя и умом тоже понимаешь...

Адрес вызова не стирается, для скрипта ты по прежнему в подпрограмме. И в стеке лежит адрес возврата.
Если войдёшь снова по вызову - то ты в новой подпрограмме. Рекурсия однако. Только неправильная, без нормального конца.
Если входишь по вызову в другую ПП - штатная вложенность вызовов. Опять же без возврата.
Т.е. и подпрограммы как таковой нет, как будто всё на педалях GOTO. +утечка и возможные проблемы.

При благоприятных условиях только маленькая утечка памяти в виде адресов возврата в стеке.
При неблагоприятных - поведение работы не ожидаемое вплоть до ухода вразнос.
Title: Re: Подпрограммы.
Post by: putman on December 21, 2016, 11:35:40 AM
Примерно так и я думаю ... значит проблемы нет кроме растущего стека.
Title: Re: Подпрограммы.
Post by: Vint on December 21, 2016, 11:49:39 AM
Я же говорю иногда есть.
Если в скрипт не большой и логика не сильно мудрёная и только выпрыгивать, но не "впрыгивать", то ничего не будет кроме утечки.
Вот если ещё "впрыгивать" то пиши пропало.

И зачем так делать? Возвращайся нормально.
Title: Re: Подпрограммы.
Post by: putman on December 23, 2016, 11:44:16 AM
Ок =).