Author Topic: Локальные переменные подпрограммы(параметры) вовсе не локальные  (Read 2417 times)

0 Members and 1 Guest are viewing this topic.

dha

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
СLICKERMANN вер  4.12.001
OC Windows 8.1

Совпадение имен переменных используемые в подпрограммах, как входные, так и локальные приводят к перезатиранию внешних переменных.
т.е. для корректной работы, подпрограммы не должны использовать одинаковые имена входных параметров, а так же имена переменных используемых до или после во всём скрипте.

"Локальные переменные подпрограммы (параметры) при этом будут уничтожены.", а так же будут зачищены все глобальные/внешние переменные у которых имена совпали с именами входных параметров, что как то не очень очевидно.

Code: [Select]
// Некоторая подпрограмма
sub(test, $id)
print("in test id:", $id)
$x = 10
print("in x:", $x)
end_sub

// Ещё одна
sub(test2, $id)
test($id)
print("in test2 id:", $id)
// Ожидаем, что выведем id, который пришел на вход но будет всегда 0
end_sub

// Объявляем переменные
$id = 1
$x = 2

print("out id before: ", $id)
print("out x before: ", $x)

// Вызываем подпрограммы
test(1)
test2(2)

// Ожидаем что id=1, а x=2
print("out id after: ", $id)
print("out x after:", $x)
// Но id=0, а x=10

h31p

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
"Локальные переменные подпрограммы (параметры) при этом будут уничтожены."

это лишь про переменные, описаные в объявлении подпрограммы, внутри скобок sub(...). всё остальное - глобально.

префиксируйте "локальные" переменные чем-то производным от имени подпрограммы, других решений нет.