Spec-Zone.ru › Octave 7

11.2 Определение функций

В самом простом виде определение функции с именем name выглядит так:

function name
  body
endfunction

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

Тело функции body состоит из операторов Octave. Это самая важная часть определения, так как она определяет, что функция должна фактически делать.

Например, вот функция, которая при выполнении заставит зазвонить звонок на вашем терминале (если это возможно):

function wakeup
  printf ("\a");
endfunction

Оператор printf (см. Ввод и вывод) просто сообщает Octave напечатать строку "\a". Специальный символ ‘\a’ обозначает символ оповещения (ASCII 7). См. Строки.

После определения этой функции вы можете попросить Octave оценить её, набрав имя функции.

Обычно вы захотите передать некоторую информацию в определенные вами функции. Синтаксис передачи параметров функции в Octave:

function name (arg-list)
  body
endfunction

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

Чтобы вывести сообщение вместе с звонком, можно изменить wakeup следующим образом:

function wakeup (message)
  printf ("\a%s\n", message);
endfunction

Вызов этой функции с помощью оператора:

wakeup ("Rise and shine!");

приведет к звонку на вашем терминале и выводу сообщения «Подъем и завтрак!», за которым следует символ новой строки (символ ‘\n’ в первом аргументе оператора printf).

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

function ret-var = name (arg-list)
  body
endfunction

Символ ret-var — это имя переменной, которая будет содержать значение, возвращаемое функцией. Эта переменная должна быть определена перед концом тела функции, чтобы функция могла вернуть значение.

Переменные, используемые в теле функции, являются локальными для функции. Переменные, указанные в arg-list и ret-var, также являются локальными для функции. См. Глобальные переменные для информации о доступе к глобальным переменным внутри функции.

Например, вот функция, вычисляющая среднее значение элементов вектора:

function retval = avg (v)
  retval = sum (v) / length (v);
endfunction

Если мы написали avg вместо этого,

function retval = avg (v)
  if (isvector (v))
    retval = sum (v) / length (v);
  endif
endfunction

а затем вызвали функцию с матрицей вместо вектора в качестве аргумента, Octave выведет сообщение об ошибке примерно такого вида:

error: value on right hand side of assignment is undefined

потому что тело оператора if никогда не выполнялось, а retval никогда не было определено. Чтобы предотвратить такие неясные ошибки, рекомендуется всегда гарантировать, что возвращаемые переменные будут всегда иметь значения и выдавать осмысленные сообщения об ошибках в случае проблем. Например, avg можно было бы написать так:

function retval = avg (v)
  retval = 0;
  if (isvector (v))
    retval = sum (v) / length (v);
  else
    error ("avg: expecting vector argument");
  endif
endfunction

Остается еще одна проблема с этой функцией. Что произойдет, если её вызвать без аргумента? Без дополнительной проверки ошибок Octave, вероятно, выведет сообщение об ошибке, которое не поможет отследить источник ошибки. Для возможности поймать такие ошибки Octave предоставляет каждой функции автоматическую переменную, называемую nargin. Каждый раз, когда функция вызывается, nargin автоматически инициализируется количеством аргументов, которые были фактически переданы в функцию. Например, мы можем переписать функцию avg следующим образом:

function retval = avg (v)
  retval = 0;
  if (nargin != 1)
    usage ("avg (vector)");
  endif
  if (isvector (v))
    retval = sum (v) / length (v);
  else
    error ("avg: expecting vector argument");
  endif
endfunction

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

: nargin () ¶
: nargin (fcn) ¶

Сообщает о количестве входных аргументов функции.

Вызванная внутри функции, возвращает количество аргументов, переданных функции. На верхнем уровне возвращает количество аргументов командной строки, переданных Octave.

Если вызвана с необязательным аргументом fcn — именем или указателем на функцию — возвращает объявленное количество аргументов, которые функция может принять.

Если последним аргументом для fcn является varargin, возвращаемое значение отрицательное. Например, функция union для множеств объявлена как

function [y, ia, ib] = union (a, b, varargin)

and

nargin ("union")
⇒ -3

Примечание для программистов: nargin не работает с скомпилированными функциями (.oct-файлы), такими как встроенные или динамически загруженные функции.

См. также: nargout, narginchk, varargin, inputname.

: inputname (n) ¶
: inputname (n, ids_only) ¶

Возвращает имя n-го аргумента вызывающей функции.

Если аргумент не является простым именем переменной, возвращается пустая строка. Примерами, которые вернут "" являются числа (5.1), выражения (y/2) и индексирование ячеек или структур (c{1} или s.field).

inputname полезна только внутри функции. При использовании в командной строке или внутри скрипта она всегда возвращает пустую строку.

По умолчанию, возвращает пустую строку, если n-й аргумент не является допустимым именем переменной. Если необязательный аргумент ids_only равен false, возвращается текст аргумента, даже если он не является допустимым именем переменной. Это расширение Octave, которое позволяет программисту просмотреть точный способ вызова функции, даже когда входы представляют собой сложные выражения.

См. также: nargin, narginchk.

: val = silent_functions () ¶
: old_val = silent_functions (new_val) ¶
: silent_functions (new_val, "local") ¶

Запрос или установка внутренней переменной, которая управляет тем, подавляется ли внутренний вывод функции.

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

При вызове изнутри функции с опцией "local", переменная изменяется локально для функции и любых вызываемых ею подпрограмм. Исходное значение переменной восстанавливается при выходе из функции.

© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/Defining-Functions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API