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

0 Members and 2 Guests are viewing this topic.

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Подпрограммы.
« on: November 27, 2017, 10:09:10 AM »
Из подпрограммы вызывать программу нельзя что ли ?

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Подпрограммы.
« Reply #1 on: November 27, 2017, 10:40:42 AM »
Из подпрограммы вызывать программу нельзя что ли ?
можно
Code: (clickermann) [Select]
SUB(sub1)
   print("sub1")
END_SUB


SUB(sub2)
   
   //вызов
   sub1()
   print("sub2")
END_SUB


//вызов
sub2()
halt

главное, чтобы вызов был ниже самой подпрограммы.

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Re: Подпрограммы.
« Reply #2 on: November 27, 2017, 11:37:05 AM »
Блин, программа настолько запутана, что только самому разбираться.
У меня по END_SUB не выходит, а почему-то перепрыгивает без всяких GOTO выше в тело подпрограммы ... и так пару раз делает, только после этого выходит.
Это я понял поставив везде LOGWRITE ("1"), с разными индексами.
В порпрограмме есть инклюды, в которых тоже подпрограммы.

Вот когда я из подпрограммы вынес инклюд, сделав его вызов по условиям работы этой подпрограммы, всё стало работать верно.

Выходит или я уже совсем запутался в коде, или в подпрограмме нельза делать инклюды в которых есть другие инклюды и вызовы подпрограмм.
ГаЛоВа кругом =).
Придется вынимать инклюды из подпрограммы, иначе не разберусь, а вам сюда давать огромный код бессмысленно. Там в основной проге 3 800 строк, и инклюдов полтора десятка с 500 до 2000 строк в каждом.

Не, не помогло.

В теле СУБа есть цикл FOR, и по команде END_SUB, программа перепрыгивает в этот цикл.

Code: [Select]
SUB (oprklass)
...
...
...
FOR ($fs = 0, $fs < $ind_klass, 1)
  logwrite ("1")
...
...
...
enklass:
logwrite ("2")
END_SUB
При выполнении этого кода в логе отображается:

1
2
1
2
1
2

и т.д.

Т.е. почему-то вместо выхода из подпрограммы, команда END_SUB заставляет перепрыгнуть в тело цикла. При этом, в цикле есть условие, которое по ELSE перекидывает выполнение на enklass:.

Голова уже почти лопнула ...
« Last Edit: November 27, 2017, 12:29:45 PM by putman »

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Re: Подпрограммы.
« Reply #3 on: November 27, 2017, 12:35:21 PM »
Как только я эту подпрограмму вынимаю из SUB и как раньше ставлю просто в инклюд, всё работает правильно.
Но ведь инклюд не вставишь несколько раз в тело основной программы, в нём метки перехода =(((((((((((((.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Подпрограммы.
« Reply #4 on: November 27, 2017, 12:41:44 PM »
все дело в твоих метках перехода. скорее всего прыгаешь из цикла, и это все в подпрограмме, отсюда и глюки.

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Re: Подпрограммы.
« Reply #5 on: November 27, 2017, 12:46:58 PM »
все дело в твоих метках перехода. скорее всего прыгаешь из цикла, и это все в подпрограмме, отсюда и глюки.
Да, прыгаю из цикла в подпрограмме (((((.
Но без подпрограммы придётся плодить кучу одинаковых инклюдов с отличающимися метками (((.

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

ХВАЛА НЕЙРОНАМ !!!
Да, из цикла нельзя выходить в подпрограмме. Похоже и END_CYC и END_SUB используют один стек для хранения точки возврата для указателя команд ... во всяком случае, мне как программисту на ассемблере это так видится.

Заработало.
« Last Edit: November 27, 2017, 01:02:57 PM by putman »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Подпрограммы.
« Reply #6 on: November 27, 2017, 06:14:59 PM »
Попробую сейчас из цикла не выпрыгивать, а завершить и потом при помощи условий выполнить то, куда перепрыгивал. Вдруг заработает ...

ХВАЛА НЕЙРОНАМ !!!
Да, из цикла нельзя выходить в подпрограмме.
Да неужели! А то, что 100500 тем про то, что нельзя выпрыгивать ты не видел.


Похоже и END_CYC и END_SUB используют один стек для хранения точки возврата для указателя команд ... во всяком случае, мне как программисту на ассемблере это так видится.
А для них везде один стек, чего их плодить... Чтобы GOTO-щики совсем берега не видели, ломая последовательность как захочется и ничего за это не было?

http://crapware.aidf.org/forum/index.php?topic=3429.msg23483#msg23483