Author Topic: ошибка в названии переменных в SUB и MAIN  (Read 2160 times)

0 Members and 1 Guest are viewing this topic.

algirdas

  • Освоившийся
  • **
  • Posts: 35
    • View Profile
Оказывается нельзя при декларировании 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 на другую.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: ошибка в названии переменных в SUB и MAIN
« Reply #1 on: August 23, 2017, 12:31:02 AM »
читаем справку:

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

Параметры, описанные в заголовке подпрограммы после ее имени, доступны в теле подпрограммы как переменные. Для вызова подпрограммы необходимо написать ее имя в сценарии вместе со всеми параметрами. Очень важно чтобы количество параметров в описании и в вызове совпадало. После выполнения подпрограммы, сценарий продолжится с момента вызова подпрограммы. Локальные переменные подпрограммы (параметры) при этом будут уничтожены.
Вызов подпрограммы без параметров все равно должен включать в себя пустые скобки ()

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: ошибка в названии переменных в SUB и MAIN
« Reply #2 on: August 23, 2017, 08:41:59 AM »
Все об этом давно знают. Плохо что это не разжёвано в справке. Описание не акцентирует внимания именно на этом моменте.

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

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

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

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

Code: (clickermann) [Select]
SUB(GREYSCALE, $fX1, $fY1, $fX2, $fY2)
...
SUB(SetTransp, $fHwnd, $fPar1)
...
« Last Edit: August 23, 2017, 08:45:18 AM by Vint »


algirdas

  • Освоившийся
  • **
  • Posts: 35
    • View Profile
Re: ошибка в названии переменных в SUB и MAIN
« Reply #3 on: August 23, 2017, 09:29:38 PM »
Может надо открыть кладовку-копилку “Давно известных вещей Clickerman” для новичка.

1. В заголовке подпрограммы - только уникальные !!! имена, собственной
подпрограммы с возвратом параметра не сделать.
2. Цикл в цикле - обязательна запись ”=0”.
3. После else - с новой строки.
4. Массив можно заполнять строкой, а не столбиком.
5. "!" - это не равно.
и т. п.

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: ошибка в названии переменных в SUB и MAIN
« Reply #4 on: August 24, 2017, 01:09:56 AM »
Quote
1. как-то странновато будет если всех детей в вашей семье будут называть Саша, если так-же зовутся мать и отец то будет совсем весело.
в пылу полемики Кирилл подцепил "всех" детей и запретил Александров Александровичей(

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