Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: algirdas on August 22, 2017, 11:31:02 PM

Title: ошибка в названии переменных в SUB и MAIN
Post 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 на другую.
Title: Re: ошибка в названии переменных в SUB и MAIN
Post by: dramster on August 23, 2017, 12:31:02 AM
читаем справку:

Подпрограмма это последовательность действий, объединенная в блок с собственным именем и набором параметров. Подпрограмму можно описать в любом месте сценария. Однако, описание подпрограммы должно быть раньше (выше) любого из ее вызовов. Хорошим тоном считается вынесение тел подпрограмм в отдельный внешний файл, подключаемый затем через директиву #include

Параметры, описанные в заголовке подпрограммы после ее имени, доступны в теле подпрограммы как переменные. Для вызова подпрограммы необходимо написать ее имя в сценарии вместе со всеми параметрами. Очень важно чтобы количество параметров в описании и в вызове совпадало. После выполнения подпрограммы, сценарий продолжится с момента вызова подпрограммы. Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
Вызов подпрограммы без параметров все равно должен включать в себя пустые скобки ()
Title: Re: ошибка в названии переменных в SUB и MAIN
Post by: Vint on August 23, 2017, 08:41:59 AM
Все об этом давно знают. Плохо что это не разжёвано в справке. Описание не акцентирует внимания именно на этом моменте.

Это из-за общей глобальности переменных и попыток ввести параметры подпрограмм. Нужно было хоть параметры сделать подобием "локальности". Но они не локальны, они просто уничтожаются при выходе и трут эти же переменные вне подпрограмм.

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

Пока нужно помнить: в параметрах подпрограммы нужно использовать уникальные переменные.

В последнее время, в своих скриптах пришёл к "венгерской нотации (https://ru.wikipedia.org/wiki/Венгерская_нотация)" для этих переменных, добавлением префикса f или f_  (function):

Code: (clickermann) [Select]
SUB(GREYSCALE, $fX1, $fY1, $fX2, $fY2)
...
SUB(SetTransp, $fHwnd, $fPar1)
...
Title: Re: ошибка в названии переменных в SUB и MAIN
Post by: algirdas on August 23, 2017, 09:29:38 PM
Может надо открыть кладовку-копилку “Давно известных вещей Clickerman” для новичка.

1. В заголовке подпрограммы - только уникальные !!! имена, собственной
подпрограммы с возвратом параметра не сделать.
2. Цикл в цикле - обязательна запись ”=0”.
3. После else - с новой строки.
4. Массив можно заполнять строкой, а не столбиком.
5. "!" - это не равно.
и т. п.
Title: Re: ошибка в названии переменных в SUB и MAIN
Post by: i0 on August 24, 2017, 01:09:56 AM
Quote
1. как-то странновато будет если всех детей в вашей семье будут называть Саша, если так-же зовутся мать и отец то будет совсем весело.
в пылу полемики Кирилл подцепил "всех" детей и запретил Александров Александровичей(

согласен с algirdas. "в описании sub – только уникальные имена параметров",
это надо талдычить для привыкших к понятию "видимость"