Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: putman on November 27, 2017, 10:09:10 AM
-
Из подпрограммы вызывать программу нельзя что ли ?
-
Из подпрограммы вызывать программу нельзя что ли ?
можно
SUB(sub1)
print("sub1")
END_SUB
SUB(sub2)
//вызов
sub1()
print("sub2")
END_SUB
//вызов
sub2()
halt
главное, чтобы вызов был ниже самой подпрограммы.
-
Блин, программа настолько запутана, что только самому разбираться.
У меня по END_SUB не выходит, а почему-то перепрыгивает без всяких GOTO выше в тело подпрограммы ... и так пару раз делает, только после этого выходит.
Это я понял поставив везде LOGWRITE ("1"), с разными индексами.
В порпрограмме есть инклюды, в которых тоже подпрограммы.
Вот когда я из подпрограммы вынес инклюд, сделав его вызов по условиям работы этой подпрограммы, всё стало работать верно.
Выходит или я уже совсем запутался в коде, или в подпрограмме нельза делать инклюды в которых есть другие инклюды и вызовы подпрограмм.
ГаЛоВа кругом =).
Придется вынимать инклюды из подпрограммы, иначе не разберусь, а вам сюда давать огромный код бессмысленно. Там в основной проге 3 800 строк, и инклюдов полтора десятка с 500 до 2000 строк в каждом.
Не, не помогло.
В теле СУБа есть цикл FOR, и по команде END_SUB, программа перепрыгивает в этот цикл.
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:.
Голова уже почти лопнула ...
-
Как только я эту подпрограмму вынимаю из SUB и как раньше ставлю просто в инклюд, всё работает правильно.
Но ведь инклюд не вставишь несколько раз в тело основной программы, в нём метки перехода =(((((((((((((.
-
все дело в твоих метках перехода. скорее всего прыгаешь из цикла, и это все в подпрограмме, отсюда и глюки.
-
все дело в твоих метках перехода. скорее всего прыгаешь из цикла, и это все в подпрограмме, отсюда и глюки.
Да, прыгаю из цикла в подпрограмме (((((.
Но без подпрограммы придётся плодить кучу одинаковых инклюдов с отличающимися метками (((.
Попробую сейчас из цикла не выпрыгивать, а завершить и потом при помощи условий выполнить то, куда перепрыгивал. Вдруг заработает ...
ХВАЛА НЕЙРОНАМ !!!
Да, из цикла нельзя выходить в подпрограмме. Похоже и END_CYC и END_SUB используют один стек для хранения точки возврата для указателя команд ... во всяком случае, мне как программисту на ассемблере это так видится.
Заработало.
-
Попробую сейчас из цикла не выпрыгивать, а завершить и потом при помощи условий выполнить то, куда перепрыгивал. Вдруг заработает ...
ХВАЛА НЕЙРОНАМ !!!
Да, из цикла нельзя выходить в подпрограмме.
Да неужели! А то, что 100500 тем про то, что нельзя выпрыгивать ты не видел.
Похоже и END_CYC и END_SUB используют один стек для хранения точки возврата для указателя команд ... во всяком случае, мне как программисту на ассемблере это так видится.
А для них везде один стек, чего их плодить... Чтобы GOTO-щики совсем берега не видели, ломая последовательность как захочется и ничего за это не было?
http://crapware.aidf.org/forum/index.php?topic=3429.msg23483#msg23483