Контроль входных и выходных параметров файл-функции
Как уже отмечалось ранее, несовпадение типов, а также количества фактических и формальных параметров является причиной неправильной работы, а в ряде случаев и аварийной останова M-функций. Для предотвращения подобных ситуаций при разработке соответствующей файл-функции в теле функции следует размещать блоки команд, осуществляющие проверку типов и количества входных значений.
Рассмотрим способы решения данной проблемы на примере следующей файл-функции MatrixOper:
function [A,B]=MatrixOper(X1,X2,x)
A=X1.*X2*x;
B=X2.*X2+x;
В результате работы данной файл-функции два массива X1 и X2 одинакового размера перемножаются поэлементно (одинаковые размеры вход-
Рис. 2.36.1. Траектория движения бусинки.
Рис. 2.36.2. Положение бусинки в момент времени t=0.
ных массивов X1 и X2 гарантируют выполнимость операции их поэлементного умножения), после чего результат этого перемножения дополнительно умножается на скаляр x. Таким образом, порождается первый из выходных массивов – массив A. Второй массив B отличается от первого тем, что получается сложением со скаляром (а не умножением).
Очевидно, что если пользователь по ошибке задаст формальные параметры X1 и X2 в виде массивов разных размеров, то в процессе выполнения файл-функции MatrixOper возникнет ошибка. Для того, чтобы избежать такой ситуации необходимо организовать в теле файл-функции MatrixOper проверку размерностей первого и второго передаваемого параметров:
function [A,B]=MatrixOper(X1,X2,x)
n1=ndims(X1);
n2=ndims(X2);
% Проверка размерностей векторов X1 и X2
if n1==n2
error('Размерности векторов X1 и X2 не совпадают')
else
for i=1:n1
if(size(X1,i)~=size(X2,i)
error('Размерности векторов не совпадают')
end
end
end
% Выполнение вычислений
A=X1.*X2*x;
A=X2.*X2+x;
После представленной выше модификации при вызове файл-функции MatrixOper с несовпадающими размерами первого и второго аргументов стандартная функция error будет корректно останавливать работу и выводить в командное окно диагностические сообщения (аргументы функции error). Далее пользователю будет необходимо повторно вызвать файл—функцию MatrixOper с правильными параметрами.
В целях дальнейшего повышения надежности следует добавить проверку третьего параметра файл-функции MatrixOper на скалярность (напомним, что в системе MATLAB скалярами являются матрицы размером 1х1), т.е. дополнить приведенный выше листинг файл-функции MatrixOper следующим фрагментом кода:
[m,n]=size(x)
if(m~=1|n~=1)
error('Третий параметр не является скаляром')
end
Разумеется, также целесообразно проверить общее число элементов в списке формальных параметров. Для этой цели в системе MATLAB предусмотрена специальная переменная с именем nargin, значением которой является количество аргументов, фактически переданное файл-функции при ее вызове. Проверка количества формальных параметров осуществляется следующим образом:
if nargin~=3
error('Неверное количество входных параметров')
end
В системе MATLAB также предусмотрена переменная nargout, содержащая число возвращаемых значений в текущей форме вызова рассматриваемой файл-функции. Так, например, вызов вида
[s1,s2,s3]=MatrixOper(X1,X2,x)
предполагает получение трех возвращаемых значений, в то время как из определения файл-функции следует, что возвращаемых параметров у файл-функции два. В целях предотвращения такого формата вызова файл-функции MatrixOper и предупреждения пользователя о несовпадении количества ожидаемых возвращаемых значений их номинальному количеству в теле файл-функции следует осуществить проверку переменной nargout:
if nargout~=2
error('Неверное количество выходных параметров')
end
Выполненные дополнения файл-функции MatrixOper обеспечивают обращение к файл-функции лишь с правильным количеством входных и выходных параметров. Вместе с тем, ранее уже рассматривались встроенные функции системы MATLAB, которые вызывались с разным количеством входных параметров (что, впрочем, не вполне типично). При этом фактически разные, но близкие друг другу по логике варианты работы функции, выполнялись под одним и тем же именем, что достаточно наглядно и удобно. Такой функцией является, например, функция plot, осуществляющая построение графиков функций.
Итак, при разработке файл-функций целесообразно предусматривать многовариантность схем вычислений, выбор которых зависит от количества выходных параметров, при этом необходимо предусмотреть проверку их количества, и, вместо прекращения выполнения файл-функции обеспечить исполнение соответствующей ветви реализуемого алгоритма. Указанное выше в полной мере относится и к количеству возвращаемых значений. Рассмотрим, например, файл-функцию Test_Function:
function [res1,res2]=Test_Function(var1,var2)
switch nargin
case 1
if nargout==1
res1=var1*2;
elseif nargout==2
res1=var1*2;
res2=var1+3;
else error('Требуется 1 или 2 выходных параметра')
end
case 2
if nargout==1
res2=var1.*var2;
elseif nargout==2
res1=var1.*var2;
res2=var1+3;
else error('Требуется 1 или 2 выходных параметра')
end
otherwise error('Требуется 1 или 2 параметра')
end
Представленная файл-функция допускает несколько вариантов заранее предусмотренных форматов вызова.
Заметим, что здесь для краткости опущена проверка размеров входных параметров, подробно рассмотренная выше. Кроме того, для большей наглядности здесь отслеживается ситуация несоответствия количества формальных и фактических входных и выходных параметров.
В целом, степень подробности проверок зависит от назначения файл-функции. Если файл-функция создается для собственного использования, то проверки, очевидно, могут быть несколько менее строгими, ввиду того, что выполнение файл-функций осуществляется в режиме интерпретации под полным контролем системы MATLAB. Возникающие ошибки автоматически обрабатываются самой этой системой, и в командном окне выдается соответствующее диагностическое сообщение. Вместе с тем, при разработке файл-функций для внешних потребителей, проверки необходимо сделать более жесткими, так как внешнему пользователю, как правило, сложно разобраться во всех деталях работы рассматриваемой файл-функции.
Отладка программы