И еще одна особенность, требующая подробных объяснений, касается совместного использования ОЗУ вызывающей программой и вызываемой подпрограммой. В отличие от простейшей подпрограммы, оформляемой при помощи операторов GOSUB и RETURN, при вызове подпрограмм, имеющих список формальных параметров, в ОЗУ на момент вызова подпрограммы создается область для хранения фактических значений параметров. Это так называемые локальные (местные) переменные. Они могут иметь имена совпадающие с именами переменных в вызывающей программе, но это не приводит к взаимным помехам, так как локальные переменные подпрограмм и переменные вызывающей программы хранятся в разных областях ОЗУ. Локальные переменные хранятся динамически, а это означает, что при повторном обращении к той же самой подпрограмме значения локальных переменных не сохраняются. Так что преимущества оператора DEF FN по сравнению со старым вариантом оформления подпрограмм в некоторых случаях могут обернуться недостатком.
Чтобы исключить этот недостаток в операторах FUNCTION и SUB при необходимости может быть использовано ключевое слово STATIC, обозначающее, что все локальные переменные хранятся статически, то есть их значения сохраняются между вызовами подпрограммы. Если же нет необходимости сохранять все, то в подпрограмме нужно использовать команду со списком статически хранимых переменных:
STATIC variable[()] [AS type] [,variable[О] [AS type]]
(3.21).
И еще одно отличие касается обмена данными между подпрограммой и вызывающей программой. Для FUNCTION и SOB допускается чтение значений переменных и изменение значений переменных, принадлежащих вызывающей программе, помимо списка параметров. Список этих переменных должен быть задан в основной программе командой
COMMON [SHARED] variablelist (3.22),
определяющей глобальные (принадлежащие основной программе) переменные доступные для совместного использования в пределах данной программы или между связанными друг с другом программами, где
SHARED указывает на то, что данные могут быть использованы функциями и процедурами.
Если переменная не объявлена статическим массивом в предыдущей команде DIM , то команда COMMON обеспечивает динамическое хранение массива. В последнем случае его размер должен быть задан в последующих командах DIM или REDIM.
Для того, чтобы переменные из этого списка были доступны подпрограмме, в ее текст должна быть включена команда со списком необходимых подпрограмме переменных:
SHARED variable[О] [AS type] [,variable[О] [AS type]]
(3.23),