2016-01-21 4 views
1
function [ muln, varargout ] = my_mul(varargin) 
%MY_MUL This function is used to multiply numbers. 
% My_mul function multiplies array of entered numbers, and outputs single 
% solution. 
% For example: my_mul(12, 2, 3, 5) gives ans = 360 

if nargout >=1 
    disp('Error, wrong number of output arguments'); 
    varargout{1} = 0; 
    return 

end 
if nargin <= 1 
    disp('Error, small number of input argumnets'); 
    return 
else 
    muln = 1; 
    for i = 1:nargin 
     muln = muln*varargin{i}; 
    end 
end 
end 

Привет, все, я просто выполняю свое задание для uni и задаю вопрос о qiuck. Как я могу заставить эту функцию выдавать ошибку, если она вызывается с несколькими выходами (она должна дать только один) Спасибо!Функция MatLab, переменный выход

+2

Если у него есть только один выход, удалите 'varargout' и верните' muln'. В противном случае вы также можете проверить 'nargout', который работает точно так же, как' nargin', только для выходов. – hbaderts

+1

Я использовал бы [error] (http://se.mathworks.com/help/matlab/ref/error.html), который выдает исключение. То есть. 'error ('Недостаточно входных аргументов')', возвращаемое значение не используется. –

ответ

1

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

Как вы заявили в своем вопросе, вам нужен только один возможный выход, который в вашем случае выглядит muln. Так что если вы просто удалить varargout из вашего определения функции, MATLAB автоматически выдаст ошибку, если слишком много выходов запрашиваются

function muln = my_mul(varargin) 

Если вы когда-нибудь сделать необходимость использования varargout, но хотите ввести ограничения на сколько выходов для любого данного сценария, вы можете проверить количество выходных аргументов, которые были запрошены, с помощью nargout, а затем выбросить ошибку с помощью функции error.

if nargout > 4 
    error('my_mul:TooManyOutputs', 'Too many outputs requested'); 
end 
0

Мое мнение таково, что при ожидаемом возврате функции необходимо бросить. В противном случае вызывающий (функция, вызывающая эту функцию) ожидает, что все будет в порядке. Обратите внимание, что disp('Error') предоставляет информацию разработчику, но не дает программе никаких указаний на то, что происходит. Что еще более важно, информация не дает никаких указаний о том, где происходит ошибка. Это может заставить разработчика выполнять тяжелую отладку, чтобы найти ошибку, что совершенно не нужно.

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

function varargout = myplot(varargin) 
filename = ''; 
idx = find(strcmp(varargin,'filename')); 
if (~isempty(idx) && length(varargin)<idx+1 && ~ischar(varargin{idx+1})) 
    error('filename property must be followed by a directory'); 
elseif(~isempty(idx)) 
    filename = varargin{idx+1}; 
    varargin([idx,idx+1]) = []; 
end 
h = plot(varargin{:}); 
varagout{1} = h; 

if (~isempty(idx)) 
    save(filename, h); 
end 
varagout{2} = filename; 

Эта функция работает как plot кроме него сохраняет рисунок в файл в случае, если указанный имя файла. В случае, если разработчику нужен дескриптор, он будет возвращен, и в случае, если разработчику понадобится каталог сохранения, он также может быть возвращен. Однако ни один из этих аргументов не нужен. Разработчик может захотеть использовать эту функцию в качестве стандартной функции построения графика, и это означает, что пользователь может вызвать myplot как myplot(x,y);, который не возвращает значение. Кроме того, обратите внимание, что даже если 'filename' не указан, функция может вернуть два выхода. Второй вывод может быть пустым массивом символов, но два выхода для вызывающего абонента никогда не вызовут сбой.

Также обратите внимание, что дальнейшая обработка ошибок не требуется. Единственные непроверенные аварии - в plot и save. То, как это обрабатывается, может быть разным для разных пользователей, и это означает, что только разумно позволить пользователю уловить ошибку и обработать ее (как это было бы сделано, если бы сэкономили или забросили бы сюжет).

Кроме того, вы также можете иметь чек, чтобы количество выходных переменных находилось в правильном диапазоне (в данном случае 0,1 или 2 выхода).

Смежные вопросы