Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: algirdas on August 22, 2017, 11:31:02 PM
-
Оказывается нельзя при декларировании SUB в перечне указывать аббревиатуру переменной, используемой
в основной MAIN программе (даже если обе они в основной программе имеют разные названия и абсолютно независимы). Контрольный пример
SUB(PROG, $a) // заглушка
move(100, 100)
END_SUB
//============ I VAR без sub ====================
$a = 100
$b = 50
WAITMS(500)
// PROG($b) - пустышка
print(" $a = ",$a) // = 100
//=============== II var c sub ==========
$a = 100
$b = 50
WAITMS(500)
PROG($b) // $ax меняет
print("c SUB $a = ",$a) // не равно 100
halt
Если в SUB(PROG, $a) вставить любое другое название переменной, напр, $c, то все работает правильно.
В реальных скриптах у меня переменная в основной программе в этих случаях могла принимать случайное не нулевое значение (причем в некоторых ветвях программы это не наблюдалось), пока я не изменял запись аббревиатуры в SUB на другую.
-
читаем справку:
Подпрограмма это последовательность действий, объединенная в блок с собственным именем и набором параметров. Подпрограмму можно описать в любом месте сценария. Однако, описание подпрограммы должно быть раньше (выше) любого из ее вызовов. Хорошим тоном считается вынесение тел подпрограмм в отдельный внешний файл, подключаемый затем через директиву #include
Параметры, описанные в заголовке подпрограммы после ее имени, доступны в теле подпрограммы как переменные. Для вызова подпрограммы необходимо написать ее имя в сценарии вместе со всеми параметрами. Очень важно чтобы количество параметров в описании и в вызове совпадало. После выполнения подпрограммы, сценарий продолжится с момента вызова подпрограммы. Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
Вызов подпрограммы без параметров все равно должен включать в себя пустые скобки ()
-
Все об этом давно знают. Плохо что это не разжёвано в справке. Описание не акцентирует внимания именно на этом моменте.
Это из-за общей глобальности переменных и попыток ввести параметры подпрограмм. Нужно было хоть параметры сделать подобием "локальности". Но они не локальны, они просто уничтожаются при выходе и трут эти же переменные вне подпрограмм.
Без полного разделения областей видимости я не знаю как это обойти малыми силами. Скорее всего это будут новые костыли которые породят новые, ранее неведанные, баги тонкости.
Пока нужно помнить: в параметрах подпрограммы нужно использовать уникальные переменные.
В последнее время, в своих скриптах пришёл к "венгерской нотации (https://ru.wikipedia.org/wiki/Венгерская_нотация)" для этих переменных, добавлением префикса f или f_ (function):
SUB(GREYSCALE, $fX1, $fY1, $fX2, $fY2)
...
SUB(SetTransp, $fHwnd, $fPar1)
...
-
Может надо открыть кладовку-копилку “Давно известных вещей Clickerman” для новичка.
1. В заголовке подпрограммы - только уникальные !!! имена, собственной
подпрограммы с возвратом параметра не сделать.
2. Цикл в цикле - обязательна запись ”=0”.
3. После else - с новой строки.
4. Массив можно заполнять строкой, а не столбиком.
5. "!" - это не равно.
и т. п.
-
1. как-то странновато будет если всех детей в вашей семье будут называть Саша, если так-же зовутся мать и отец то будет совсем весело.
в пылу полемики Кирилл подцепил "всех" детей и запретил Александров Александровичей(
согласен с algirdas. "в описании sub – только уникальные имена параметров",
это надо талдычить для привыкших к понятию "видимость"