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.

example

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

collapse all

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

Tips

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