coder.wref - Indicate write-only data to pass by reference - MATLAB (original) (raw)

Indicate write-only data to pass by reference

Syntax

Description

coder.wref([arg](#bvms7rl-arg)) indicates thatarg is a write-only expression or variable to pass by reference to an external C/C++ function. Use coder.wref only inside acoder.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 bycoder.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.

example

coder.wref([arg](#bvms7rl-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 Array by Reference as Write-Only

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))); ...

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, 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 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. Use coder.cstructname to indicate that the structure type for s has the nameMyStruct that is defined in the C header fileMyStruct.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

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

collapse all

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

expand all

The coder.wref function support only MATLAB to High-Level Synthesis (HLS) workflow in HDL Coder™.

Version History

Introduced in R2011a