Documentation

coder.wref

Indicate write-only data to pass by reference

Syntax

coder.wref(arg)

Description

example

coder.wref(arg)indicates thatargis a write-only expression or variable to pass by reference to an external C/C++ function. Usecoder.wrefonly inside acoder.cevalcall. Usingcoder.wref(arg)can allow the code generator to optimize the generated code by ignoring prior assignments toarg. Use a separatecoder.wrefconstruct 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 ofargin 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 variablearrayas a pointer to a double.

Call the C functioninit_arrayto initialize all elements ofyto 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 forshas the nameMyStructthat 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

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

  • 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

  • Ifargis 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, usecoder.cstructnameto provide the name of a C structure type that is defined in a C header file.

  • In MATLAB,coder.wrefresults in an error. To parametrize your MATLAB code so that it can run in MATLAB and in generated code, usecoder.target.

  • You can usecoder.opaqueto declare variables that you pass to and from an external C/C++ function.

Introduced in R2011a

Was this topic helpful?