coder.wref
Indicate write-only data to pass by reference
Syntax
coder.wref(arg)
Description
coder.wref(
indicates thatarg
)arg
is a write-only expression or variable to pass by reference to an external C/C++ function. Usecoder.wref
only inside acoder.ceval
call. Usingcoder.wref(arg)
can allow the code generator to optimize the generated code by ignoring prior assignments toarg
. Use a separatecoder.wref
construct for each argument that you pass by reference to the function.
Note
The memory referenced bycoder.wref(arg)
is write-only. For your generated code to avoid reading uninitialized memory, the C/C++ function must fully initialize the memory inarg
前阅读。初始化内存的ssigning values to every element ofarg
in your C/C++ function. Otherwise, undefined run-time behavior can result.
Examples
Pass Array by Reference as Write-Only
Suppose that you have a C functioninit_array
.
void init_array(double* array, int numel) { for(int i = 0; i < numel; i++) { array[i] = 42; } }
The C function defines the input variablearray
as a pointer to a double.
Call the C functioninit_array
to initialize all elements ofy
to 42:
...Y = zeros(5, 10); coder.ceval('init_array', coder.wref(Y), int32(numel(Y)));...
Pass Multiple Arguments as a Write-Only Reference
...U = zeros(5, 10); V = zeros(5, 10); coder.ceval('my_fcn', coder.wref(U), int32(numel(U)), coder.wref(V), int32(numel(V)));...
Pass Class Property as a Write-Only Reference
...x = myClass; x.prop = 1; coder.ceval('foo', coder.wref(x.prop));...
Pass Structure as a Write-Only Reference
To indicate that the structure type is defined in a C header file, usecoder.cstructname
.
Suppose that you have the C functioninit_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 namedMyStruct
:
#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 toinit_struct
. To indicate that the structure type fors
has the nameMyStruct
that is defined in the C header fileMyStruct.h
, usecoder.cstructname
.
functiony = foo%#codegeny = 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:libfoo-report
Pass Structure Field as a Write-Only Reference
...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));...
Input Arguments
Limitations
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. SeePassing By Reference Not Supported for Some Properties.
Tips
If
arg
is an array, thencoder.wref(arg)
provides the address of the first element of the array. Thecoder.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, usecoder.target
.You can use
coder.opaque
to declare variables that you pass to and from an external C/C++ function.