Author Topic: Подпрограммы.  (Read 1687 times)

0 Members and 2 Guests are viewing this topic.

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Подпрограммы.
« on: December 21, 2016, 08:25:39 AM »
Здравствуйте.

Меня смутил выход из подпрограммы через GOTO.
Я захожу в неё, и по некоторому условию выхожу не через END_SUB.
Почему не происходит сбоя при повторном вызове этой, или другой подпрограммы ?
Разве адрес вызова первой стирается после любого выхода из тела даже по GOTO ?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограммы.
« Reply #1 on: December 21, 2016, 09:32:13 AM »
Тебя смущает, а ты всё равно выходишь. Мыши кололись...
И никто не разрешал так выходить, но и защиты "от дурака" не встроено.

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

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

При благоприятных условиях только маленькая утечка памяти в виде адресов возврата в стеке.
При неблагоприятных - поведение работы не ожидаемое вплоть до ухода вразнос.
« Last Edit: December 21, 2016, 09:36:35 AM by Vint »


putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Re: Подпрограммы.
« Reply #2 on: December 21, 2016, 11:35:40 AM »
Примерно так и я думаю ... значит проблемы нет кроме растущего стека.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограммы.
« Reply #3 on: December 21, 2016, 11:49:39 AM »
Я же говорю иногда есть.
Если в скрипт не большой и логика не сильно мудрёная и только выпрыгивать, но не "впрыгивать", то ничего не будет кроме утечки.
Вот если ещё "впрыгивать" то пиши пропало.

И зачем так делать? Возвращайся нормально.


putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Re: Подпрограммы.
« Reply #4 on: December 23, 2016, 11:44:16 AM »
Ок =).