Error( 'Must be 2 return values' )
End
Осуществлённые нами проверки приводят к тому, что функцию можно вызвать только с правильным числом входных параметров и возвращаемых значений. Однако ранее мы встречались со встроенными функциями системы MATLAB, которые могли быть вызваны с разным числом входных параметров (и это очень типично). В результате фактически разные работы бликого типа выполняются под одним и тем же именем функции, что весьма наглядно и удобно. Таковой, например, является функция plot, имя которой говорит о построении графиков функций. Если бы разные варианты вызовов этой функции пришлось бы осуществлять под разными именами, то от наглядности не осталось бы и следа.
Подведём итог этим рассуждениям: когда функция допускает многовариантность работы при разном числе входных аргументов, это нужно предусмотреть при проверках их числа, и вместо прекращения работы функции осуществить разные ветви выполнения. То же касается и числа возвращаемых значений. В определении функции при этом нужно использовать максимально возможное число как первых, так и вторых. Так, функция
function [ res1, res2] = TestFunc2(var1, var2) switch nargin case 1 if nargout == 1, res1 = var1 * 2; elseif nargout == 2, res1 = var1 * 2; res2 = var1 + 3; else error('Must be 1 or 2 return values'); end case 2 if nargout == 1, res1 = var1.* var2; elseif nargout == 2, res1 = var1.* var2; res2 = var1 + 3; else error('Must be 1 or 2 return values'); end otherwise error('Must be 1 or 2 parameters'); end
допускает много вариантов корректных вызовов. Для краткости мы здесь опустили проверку размеров входных параметров, подробно рассмотренную выше. Кроме того, мы здесь намеренно для большей наглядности выполняем некоторую лишнюю работу: на практике MATLAB самостоятельно отслеживает ситуацию превышения числа параметров и возвращаемых значений над номинальным их числом.
В заключение отметим, что степень подробности проверок зависит от предназначения функции. Если M-функция пишется для собственного потребления, проверки могут быть менее строгими. Но если предполагается передача функции для внешнего потребления, то проверки нужно сделать более жёсткими, так как внешнему пользователю трудно разобраться во всех деталях работы вашей функции.
function [ res1, res2] = TestFunc2(var1, var2) switch nargin case 1 if nargout == 1, res1 = var1 * 2; elseif nargout == 2, res1 = var1 * 2; res2 = var1 + 3; else error('Must be 1 or 2 return values'); end case 2 if nargout == 1, res1 = var1.* var2; elseif nargout == 2, res1 = var1.* var2; res2 = var1 + 3; else error('Must be 1 or 2 return values'); end otherwise error('Must be 1 or 2 parameters'); end
#$+Видимость имён переменных и имён функций.
Локальные и глобальные переменные. Функция располагает собственным, изолированным от рабочего пространства системы MATLAB, пространством переменных. Поэтому, если перед вызовом M-функции в командном окне MATLABа была определена переменная с именем, например, varName1, то нельзя рассчитывать на то, что переменная в теле функции с этим же именем уже имеет некоторое значение. Это совсем другая переменная (хотя у неё и то же самое имя varName1) и располагается она в памяти машины в другой области памяти.
Переменные, которые используются в теле M-функции и не совпадают с именами формальных параметров этой функции, называются локальными. По-другому говорят, что они видимы лишь в пределах M-функции. Извне они не видны (не достижимы). Внутри функции не видны переменные, определённые в командном окне MATLABа - они являются внешними по отношению к функции и не видны в ней.
Аналогично, локальные внутри некоторой функции переменные не видны внутри другой M-функции.
Одним из каналов передачи информации из командного окна системы MATLAB в M-функцию и из одной функции в другую является механизм параметров функции. Другим таким механизмом являются глобальные переменные.
Чтобы рабочая область системы MATLAB и несколько M-функций могли совместно использовать переменную с некоторым именем, её всюду нужно объявить как глобальную с помощью ключевого слова global. К примеру, переменная glVarS, участвующая в вычислениях в рабочем пространстве и в функции FuncWithGlobVar является одной и той же переменной (единственный участок памяти) повсюду - поэтому её можно использовать в функции без дополнительного присваивания её какого-либо значения:
Так как у глобальных переменных "глобальная" область действия, то чтобы случайно (по ошибке) не переопределить её где-либо, желательно давать таким переменным более мнемонические (более длинные и осмысленные) имена.
Теперь рассмотрим вопрос о видимости имён функций. Если мы сохранили функцию с некоторым именем в файле с этим же именем и расширением m, и кроме того если системе MATLAB известен путь к этому файлу на диске, то эту функцию можно вызывать как из командного окна, так и из других функций.
Однако в тексте M-функции можно поместить опеределения нескольких функций, причём только одна из них может совпадать по имени с именем файла. Именно эта функция и будет видна из командного окна и других функций. Все остальные функции будут внутренними - их могут вызывать только функции из того же файла.
Например, если в файле ManyFunc.m будет содержаться следующий текст
function ret1 = ManyFunc(x1, x2)
ret1 = x1.* x2 + AnotherFunc(x1)
function ret2 = AnotherFunc(y)
ret2 = y.* y + 2 * y + 3;
состоящий из определений двух функций с именами ManyFunc и AnotherFunc, то извне можно вызывать только функцию ManyFunc. По-другому можно сказать, что извне видны только функции с именами, совпадающими с именами M-файлов. Остальные функции должны вызываться этой функцией и другими внутренними функциями.
#$+Разработка и отладка M-функций.
Разрабатывая функцию, вы в первую очередь разрабатываете алгоритм решения некторой задачи, после чего переводите его на формальный язык кодирования, которым и является M-язык. Несмотря на довольно высокую наглядность M-языка (отсутствуют низкоуровневые конструкции, близкие к машинным командам), всё равно это формальный язык. По прошествии времени детали разработок забудутся и для модификации функции придётся всё вспоминать снова.
Чтобы упростить процесс дальнейшей модификации функции, а также её отладки на стадии, когда ещё не удалось добиться правильной работы, в текст функции вставляют комментарии.
Комментарии могут занимать отдельные строки, начинающиеся с символа %, после которого следует текст комментария. Также комментарии можно располагать в конце любой строки кода, поскольку интерпретатор M-языка, встретив знак %, считает все символы после него просто комментарием (а не командами, подлежащими переводу в машинную форму и исполнению).
Особую роль в системе MATLAB имеют комментарии, располагающиеся в смежном наборе строк сразу за заголовком определения функции. Весь этот набор строк выводится в командное окно системы MATLAB при исполнении команды
Дата добавления: 2015-01-18 | Просмотры: 606 | Нарушение авторских прав
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|