Indicate write-only data to pass by reference
coder.wref(
indicates that
arg
)arg
is a write-only expression or variable to pass by reference to an
external C/C++ function. Use coder.wref
only inside a
coder.ceval
call. This function enables the code generator to
optimize the generated code by ignoring prior assignments to arg
in your
MATLAB® code, because the external function is assumed to not read from the data.
Write to all the elements of arg
in your external code to fully initialize the memory.
Note
The C/C++ function must fully initialize the memory referenced by
coder.wref(arg)
. Initialize the memory by assigning values to every
element of arg
in your C/C++ code. If the generated code tries to
read from uninitialized memory, it can cause undefined run-time behavior.
See also coder.ref
and coder.rref
.
Suppose that you have a C function init_array
.
void init_array(double* array, int numel) { for(int i = 0; i < numel; i++) { array[i] = 42; } }
The C function defines the input variable array
as a pointer to a
double.
Call the C function init_array
to initialize
all elements of y
to 42:
... Y = zeros(5, 10); coder.ceval('init_array', coder.wref(Y), int32(numel(Y))); ...
... U = zeros(5, 10); V = zeros(5, 10); coder.ceval('my_fcn', coder.wref(U), int32(numel(U)), coder.wref(V), int32(numel(V))); ...
... x = myClass; x.prop = 1; coder.ceval('foo', coder.wref(x.prop)); ...
To indicate that the structure type is defined
in a C header file, use coder.cstructname
.
Suppose that you have the C function init_struct
. This function
writes to the input argument but does not read from it.
#include "MyStruct.h" void init_struct(struct MyStruct *my_struct) { my_struct->f1 = 1; my_struct->f2 = 2; }
The C header file, MyStruct.h
, defines a structure type named
MyStruct
:
#ifndef MYSTRUCT #define MYSTRUCT typedef struct MyStruct { double f1; double f2; } MyStruct; void init_struct(struct MyStruct *my_struct); #endif
In your MATLAB function, pass a structure as a write-only reference to
init_struct
. Use coder.cstructname
to indicate
that the structure type for s
has the name
MyStruct
that is defined in the C header file
MyStruct.h
.
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','init_struct.c'); s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); coder.ceval('init_struct', coder.wref(s));
To generate standalone library code, enter:
codegen -config:lib foo -report
... s = struct('s1', struct('a', [0 1])); coder.ceval('foo', coder.wref(s.s1.a)); ...
You can also pass an element of an array of structures:
... c = repmat(struct('u',magic(2)),1,10); b = repmat(struct('c',c),3,6); a = struct('b',b); coder.ceval('foo', coder.wref(a.b(3,4).c(2).u)); ...
You cannot pass these data types by reference:
Class or System object
Cell array or index into a cell array
If a property has a get method, a set method, or validators, or is a System object property with certain attributes, then you cannot pass the property by reference to an external function. See Passing By Reference Not Supported for Some Properties.
If arg
is an array, then coder.wref(arg)
provides the address of the first element of the array. The
coder.wref(arg)
function does not contain information about the size
of the array. If the C function must know the number of elements of your data, pass that
information as a separate argument. For example:
coder.ceval('myFun',coder.wref(arg),int32(numel(arg));
When you pass a structure by reference to an external C/C++ function, use coder.cstructname
to provide the name of
a C structure type that is defined in a C header file.
In MATLAB, coder.wref
results in an error. To parametrize your
MATLAB code so that it can run in MATLAB and in generated code, use coder.target
.
You can use coder.opaque
to declare variables that you pass to and from an external
C/C++ function.
coder.ceval
| coder.cstructname
| coder.opaque
| coder.ref
| coder.rref