MATLAB Answers

Specifying inputs/outputs for C-code functions generated from MATLAB m-code using emlc as pass-by-reference

18 views (last 30 days)
How do I make the generated c-code use pass-by-reference for all inputs and outputs instead of pass-by-value?
I am using emlc to generate c-code for a function that has constant, scalar, array (vector), and struct inputs and outputs. I am going to be calling this c-code from FORTRAN code, so I need to use pass-by-reference for all inputs and outputs. Depending on my FORTRAN compiler, I also may need to specify a calling convention. In the past, I have been writing wrappers for the generated code, which is tedious. How can I specify the interface that I want?
Todd on 18 Aug 2011
Now the problem that I'm having is that two different functions create different versions of mldivide.c, so I can't put all of the object files in the same folder. If I try to put my wrapper functions all into one file and build that, they the function names get mangled.
Is there a way to define what the function name will be for a non-top-level function? Similar to the eml.cstructname function?

Sign in to comment.

Accepted Answer

Alexander Bottema
Alexander Bottema on 17 Aug 2011
To force call-by-reference for the top-level function you declare every input also as output.
Suppose you have the following function signature:
function y = foobar(a,b,c)
and you want call-by-reference on 'a', 'b' and 'c'.
Then add them as etra outputs:
function [y,a,b,c] = foobar(a,b,c)
For example:
function [y,a,b,c] = foobar(a,b,c) %#eml
y = a + b.field1 + c(3);
compiled with:
emlc -T RTW foobar.m -eg { 0, struct('field1',0), zeros(1,10) }
Will produce the C code:
real_T foobar(const real_T *a, const struct_T *b, const real_T c[10]) { return (*a + b->field1) + c[2]; }
As you can see the parameters 'a', 'b' and 'c' are now being passed by reference. In C arrays are always passed by reference so there are no need for using a pointer on that argument.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by