Имя функции как тип переменной
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Одно из достоинств языка Scilab является то, что функции являются типом переменных. Это означает, что мы можем хранить функции в переменных и использовать переменные как функции. В компилируемых языках эта возможность часто называется «указатель на функцию».

В следующем примере (рис 1.5.3-3) определим функцию f. Затем, установим содержимое переменной fp равным функции f. Наконец, мы можем использовать функцию fp как обычную функцию.

--> // Загрузка сценария РИС15303 и обращения к функции f

--> exec('РИС15303.sce', 0);

-->

-->clear

--> fp = f

 fp =

[y] = fp(t)

-->

--> fp(1)

 ans =

2.

 

Рис. 1.5.3-3 Пример использования указателя на функцию

 

Эта возможность позволяет использовать широко распространённый инструмент языков программирования, известный как функция обратного вызова (callback).

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

Поскольку функции являются переменными можно устанавливать значения этих переменных несколько раз. Для того, чтобы предупредить пользователей от нежелательного переопределения функций, при переопределении может появляться сообщение-предупреждение, как показано в примере на рис 1.3.5-4.

 

--> // Загрузка сценария РИС15304 и переопределение функций

--> exec('РИС15304.sce', 0);

-->

-->clear

--> f = f1

f =

[y] = f(x)

-->

--> f = f2

Предупреждение: переопределение функции: f.

Используйте funcprot(0) чтобы не выводить это сообщение

--> f =

--> [y] = f(x)

Рис. 1.5.3-4. Получение предупреждения о переопределении функции

 

В данном случае нет причин защищать себя от присвоения переменной f нового значения, в Scilab имеется простой способ отключить на время предупреждение. Функция funcprot позволяет заблокировать режим защиты функций:

p r=funcprot() – получить текущий режим защиты функций;

funcprot(0) – нет сообщений, когда функция переопределена;

funcprot(1)– выдает предупреждение о переопределении функции

(по умолчанию);

funcprot(2) – выдает ошибку, когда функция переопределена.

 

Scilab позволяет переопределить любые функции (даже библиотечные), но это вызывает ошибку и выводится соответствующее сообщение. В следующем примере (рис. 1.5.3-5) функция rand определена как обычная функция, проверим, можем ли мы вызвать её как любую другую функцию, определённую пользователем.

 

--> // Загрузка сценария РИС15305 и переопределение функций rand

--> exec('РИС15305.sce', 0);

-->clear

--> rand()

Предупреждение: переопределение функции: rand.

 Используйте funcprot(0) чтобы не выводить это сообщение

-->

-->funcprot(0)

-->y = rand(1)

y =

2.

Рис. 1.5.3-5 Переопределение встроенный библиотечной функции rand,
описанной в сценарии РИС15305

Появилось сообщение о том, что функцию rand переопределили. То есть функция rand уже существует в Scilab, что может быть легко проверено командой help rand. Действительно, встроенная функция rand позволяет генерировать случайные числа, и мы, конечно же, не хотим ее терять и переопределить. В данном случае ошибка очевидна, но на практике ситуации могут быть гораздо более сложными, поэтому переопределять функции надо очень осторожно.

 

 


Видимость переменных

Как известно, переменные, созданные в процессе выполнения сессии, хранятся в области Обозревателя переменных, кроме тех, которые описаны в функциях. То есть переменные, описанные внутри функций, хранятся в своих локальных областях памяти. Поэтому функция может получить доступ к переменным только в том случае, если данные передаются в качестве аргументов. Это позволяет защитить целостность данных. Сценарий, представленный на рис. 1.5.3-6 содержит три независимые функции со своими локальными переменными. Загрузив сценарий, и вызвав функцию vstfunиз Командного окна, можно видеть, что переменные функций являются локальными и недоступны как из Командного окна, так и из сценария.

 

--> // Загрузка сценария РИС15306 --> // и обращение к функции vstfun -->clear --> exec('РИС15306.sce', 0); --> --> x = 2; --> r = vstfun(x)  r = 8.  

 

Рис. 1.5.3-6 Отображение данных сессии в окне Обозреватель переменных

В окне Обозреватель переменных отобразились только две переменные (r и x), используемые в Командном окне. Таким образом, локальные переменные не доступны ни командной строке, ни другой sce-функции.

Один из способов получить доступ к переменным локальных функций объявить переменные глобальными (global). Глобальные переменные хранятся в своей области глобальных переменных. Особенность глобальных переменных состоит в том, что они видны тем объектам текущего сеанса, где они описаны как глобальные.

Однако использовать глобальные переменные опасно, поскольку:

1) любая функция может получить доступ и обновить глобальную переменную, в этом случае другие функции, использующие эту переменную, могут получить неожиданные результаты.

2) «новая» глобальная переменная может случайно получить то же самое имя, что и «старая» (уже существующая) глобальная переменная. Это приводит к ошибке, которая трудно диагностируется.

 

Прежде чем обращаться к глобальным переменным функции из командной строки их необходимо объявить. Для этого предназначена функция global, имеющая следующий формат:

global(СписокГлобальныхПеременных )

где в СписокеГлобальныхПеременных через запятую перечисляются имена глобальных переменных, заключенные в кавычки, например, global('a','b','x'). Если СписокГлобальныхПеременных содержит одну переменную, то допускается создание списка без скобок и кавычек.

Создадим, например, в командной строке глобальную переменную x, присвоив ей значение 2. Теперь рассмотрим пример, приведенный на рис.1.5.3-7.

--> // Загрузка сценария РИС15307 и обращение к функциям f 1 и f 2 --> -->clear --> exec('РИС15307.sce'); -->a = 1; -->f1() // Обращение к функции f1 -->a a = 4. -->f2() // Обращение к функции f 2 -->a a = 4.

 

Рис.1.5.3-7 Пример, иллюстрирующий область видимости переменных

 

Обратите внимание, что при обращении к функции f1, переменная а изменила свое значение, а при обращении к функции f2 значение а осталось прежним. Дело в том, что и в командной строке, и в функции f1, переменная, а объявлена глобальной, то есть она является видимой для f1. В функции f2 переменная а является локальной, то есть невидимой для функции f2, таким образом, это две разные переменные, расположенные в разных областях оперативной памяти. 

В Scilab имеется еще ряд функций для работы с глобальными переменными, имеющими тот же формат, что и функция global:

clearglobal – уничтожает глобальные переменные списка;

isglobal – проверяет, является ли переменная глобальной;

gstacksize – определяет размер области глобальных переменных.

 

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

 

 

1.5.4. Алгоритмические операторы Scilab
и базовые программные структуры

 

В программировании различают линейную и нелинейную структуру программного кода [19]. Программную структуру называют линейной, если операторы (инструкции, строки программного кода функции) выполняются строго в том порядке, в котором они написаны. Однако существует множество алгоритмов, структура которых нелинейная, то есть элементы алгоритма выполняются в зависимости от определенных условий, иногда с конечным числом повторений – регулярных циклов, иногда в виде циклов, завершаемых при выполнении заданного условия. Практически любая серьезная программа имеет нелинейную структуру. Для создания таких программ необходимы специальные управляющие структуры. Они имеются в любом языке программирования высокого уровня, в том числе и в Scilab [20].

Рассмотрим эти элементы подробнее.


Дата: 2019-11-01, просмотров: 422.