coder.ref - Indicate data to pass by reference - MATLAB (original) (raw)
Indicate data to pass by reference
Syntax
Description
coder.ref([arg](#bvms2hk-arg))
indicates thatarg
is an expression or variable to pass by reference to an external C/C++ function. Use coder.ref
inside a coder.ceval
call only. The C/C++ function can read from or write to the variable passed by reference. Use a separate coder.ref
construct for each argument that you pass by reference to the function.
See also coder.rref and coder.wref.
coder.ref([arg](#bvms2hk-arg),'gpu')
indicates thatarg
is a GPU argument. This option requires a valid GPU Coder™ license. If the coder.ceval
calls a CUDA® GPU __device__
function, the code generator ignores the'gpu'
specification.
Examples
Pass Scalar Variable by Reference
Consider the C function addone
that returns the value of an input plus one:
double addone(double* p) { return *p + 1; }
The C function defines the input variable p
as a pointer to a double.
Pass the input by reference to addone
:
... y = 0; u = 42; y = coder.ceval('addone', coder.ref(u)); ...
Pass Multiple Arguments by Reference
... u = 1; v = 2; y = coder.ceval('my_fcn', coder.ref(u), coder.ref(v)); ...
Pass Class Property by Reference
... x = myClass; x.prop = 1; coder.ceval('foo', coder.ref(x.prop)); ...
Pass a Structure by Reference
To indicate that the structure type is defined in a C header file, use coder.cstructname
.
Suppose that you have the C function incr_struct
. This function reads from and writes to the input argument.
#include "MyStruct.h"
void incr_struct(struct MyStruct *my_struct) { my_struct->f1 = my_struct->f1 + 1; my_struct->f2 = my_struct->f2 + 1; }
The C header file, MyStruct.h
, defines a structure type namedMyStruct
:
#ifndef MYSTRUCT #define MYSTRUCT
typedef struct MyStruct { double f1; double f2; } MyStruct;
void incr_struct(struct MyStruct *my_struct);
#endif
In your MATLAB® function, pass a structure by reference to incr_struct
. To indicate that the structure type for s
has the nameMyStruct
that is defined in the C header fileMyStruct.h
, use coder.cstructname
.
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','incr_struct.c');
s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); coder.ceval('incr_struct', coder.ref(s));
To generate standalone library code, enter:
codegen -config:lib foo -report
Pass Structure Field by Reference
... s = struct('s1', struct('a', [0 1])); coder.ceval('foo', coder.ref(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.ref(a.b(3,4).c(2).u)); ...
Input Arguments
arg
— Argument to pass by reference
scalar variable | array | element of an array | structure | structure field | object property
Argument to pass by reference to an external C/C++ function. The argument cannot be a class, a System object™, a cell array, or an index into a cell array.
Data Types: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
| char
| struct
Complex Number Support: Yes
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. See Passing By Reference Not Supported for Some Properties.
Tips
- If
arg
is an array, thencoder.ref(arg)
provides the address of the first element of the array. Thecoder.ref(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.ref(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.ref
results in an error. To parameterize 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.
Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
GPU Code Generation
Generate CUDA® code for NVIDIA® GPUs using GPU Coder™.
HDL Code Generation
Generate VHDL, Verilog and SystemVerilog code for FPGA and ASIC designs using HDL Coder™.
The coder.ref
function support only MATLAB to High-Level Synthesis (HLS) workflow in HDL Coder™.
Version History
Introduced in R2011a