Wrapping a MEX function that has an "ans" output in some cases
1 view (last 30 days)
Show older comments
Joel Andersson
on 25 Sep 2015
Commented: Joel Andersson
on 25 Sep 2015
I have a MEX function that returns an "ans" output in some cases, but in others not. It looks something like this:
/* Listing: fooMEX.c */
#include <mex.h>
void mexFunction(int resc, mxArray *resv[], int argc, const mxArray *argv[]) {
mxAssert(argc==1 && mxIsLogicalScalar(argv[0]), "nope");
bool with_ans = mxIsLogicalScalarTrue(argv[0]);
if (with_ans) {
resv[0] = mxCreateDoubleScalar(42);
}
}
Usage from MATLAB:
fooMEX(false) % no ans
fooMEX(true) % ans = 42
Now I want wrap this function in a MATLAB function, but I don't see how it can be done. This doesn't work:
function varargout = foo(with_ans)
/* ERROR: "One or more output arguments not assigned during call to "fooMEX" */
varargout{1:nargout} = fooMEX(with_ans);
end
I can achieve it with a try-catch, but that's an ugly hack:
function varargout = foo(with_ans)
try
varargout{1:nargout} = fooMEX(with_ans);
catch
fooMEX(with_ans);
end
end
Is there a better way?
Joel
P.S: This is a simplified context. In the real context, "with_ans" is actually an index corresponding to one out of thousands of wrapped C++ functions. The wrapping functions, with different indices, are member functions of a "classdef" style MATLAB class.
0 Comments
Accepted Answer
James Tursa
on 25 Sep 2015
Edited: James Tursa
on 25 Sep 2015
I am not on a machine with MATLAB at the moment to verify this, but I think the syntax for passing variable number of arguments up the chain of function calls is to use square brackets on the lhs. E.g.,
[varargout{1:nargout}] = fooMEX(with_ans);
More Answers (1)
Walter Roberson
on 25 Sep 2015
If you need to you can test nargout and only do the assignment when it is at least 1.
However, my recollection is that the presence or absence of an output is carried "upstream". Test this:
fooz = @(x)find(x+nargout);
bar = @(x) fooz(x);
bar(-2:2)
z = bar(-2:2)
[z,q] = bar(-2:2)
The changes in output reflect that fooz sees different nargout even though the nargout is being inherited from its caller bar.
I would thus suspect that you can possibly code with a real variable name rather than varargout, and let the nargout be inherited from the caller.
0 Comments
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!