Автокликер 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