Как написать функцию, которая не выдает ошибку «неправильное количество аргументов» - PullRequest
0 голосов
/ 23 июня 2011

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

Вот откуда я начинаю:

function varargout=fname(varargin)
% FNAME
% Usage: output=fname(input)

% Arguments check
if(nargin~=1 || nargout~=1)
    disp('Function fname requires one input argument');
    disp('and one output argument');
    disp('Try `help fname`');
    varargout(1:nargout)={0};
    return;
end

input=varargin{1};

output=input;

varargout(1)={output};
end

Однако это не работает так, как мне бы хотелось.Есть ли способ написать функцию, которая:

  • никогда не выбрасывает ошибку «неправильное количество аргументов» (так что остальная часть выполнения может продолжаться)
  • принимает переменное числовходные и выходные аргументы и проверяет их внутри функции
  • (возможно, более хитроумно), если число входных / выходных аргументов неверно, не заменяет значение предоставленных выходных аргументов (так что любой неуместный вызов делаетне стирайте предыдущее значение выходного аргумента)

Я открыт для любых предложений / других методов.

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ: спасибо @Amro за его ответ, я думаю, что мне здесь не хватает либо вызова по адресу ссылки для функций Matlab, либо способа прерывания функции без возврата чего-либо и без остановки остальной части выполнения.

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Вот один из способов реализации вашей функции:

function varargout = fname(input,varargin)
    %# FNAME
    %# Usage: output=fname(input)

    %%# INPUT
    if nargin<1
        varargout(1:nargout) = {[]};
        warning('Not enough input arguments.'), return
    end
    if ~isempty(varargin)
        warning('Too many input arguments.')
    end

    %%# YOUR CODE: manipulate input, and compute output
    output = input;

    %%# OUTPUT
    varargout{1} = output;
    if nargout>1
        warning('Too many output arguments.')
        varargout(2:nargout) = {[]};
    end
end

Очевидно, вы можете настроить предупреждающие сообщения по своему вкусу ...

Кроме того, если вы хотите, чтобы ваша функция просто печаталасообщение вместо выдачи предупреждений, замените все WARNING вызовами на простые DISP вызовы функций.

Примеры вызовов функций:

fname()
fname(1)
fname(1,2)
x = fname()
x = fname(1)
x = fname(1,2)
[x,y] = fname()
[x,y] = fname(1)
[x,y] = fname(1,2)

вышеуказанные вызовы выполняются, как ожидается (с указанием предупреждающих сообщений, когда это применимо).Одно предупреждение, однако, в последних трех вызовах, если бы переменная y уже существовала в рабочей области до вызовов, она была бы перезаписана пустым значением y=[] в каждом ...

0 голосов
/ 23 июня 2011

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

[a, b, c] = fname('foo');

, тогда fname требуется для возврата (как минимум) трех выходов.Нет никакого способа сказать MATLAB, что он должен оставить b и c в одиночку, если fname возвращает только один вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...