Aabaz
Aabaz

Reputation: 3116

How to write a function that does not throw a "wrong number of arguments" error

I am trying to write a minimal function that can be called with a variable number of arguments but that will not throw a wrong number of arguments error if miscalled.

Here is where I start from :

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

However this does not work as I would like it to. Is there a way to write a function that :

I am open to any suggestions / other methods.

Thank you for your help.

UPDATE: thanks to @Amro for his answer, I guess what I miss here is either a call by address of reference for Matlab functions or a way to interrupt a function without returning anything and without stopping the rest of the execution.

Upvotes: 0

Views: 3971

Answers (2)

Amro
Amro

Reputation: 124563

Here is one way to implement your function:

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

Obviously you can customize the warning messages to your liking...

Also, if you want your function to simply print the message instead of issuing warnings, replace all WARNING calls with simple DISP function calls.

Examples of function call:

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)

The above calls execute as expected (showing warning messages when applicable). One caveat though, in the last three calls, if the variable y already existed in the workspace prior to the calls, it would be overwritten by the empty value y=[] in each...

Upvotes: 1

SCFrench
SCFrench

Reputation: 8374

If I understand your question correctly, then the answer is no. If a caller calls a function like this:

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

then fname is required to return (at least) three outputs. There's no way to tell MATLAB that it should leave b and c alone if fname only returns one output.

Upvotes: 0

Related Questions