Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

coder.wref

指示要按引用传递的只写数据

说明

示例

coder.wref(arg) 表示 arg 是按引用传递给外部 C/C++ 函数的只写表达式或变量。仅在 coder.ceval 调用中使用 coder.wref。此函数使代码生成器能够通过忽略您的 MATLAB® 代码中对 arg 的先前赋值来优化生成的代码,因为外部函数假定是不从数据中读取的。写入外部代码中 arg 的所有元素,以完全初始化内存。

注意

C/C++ 函数必须完全初始化 coder.wref(arg) 引用的内存。通过在 C/C++ 代码中为 arg 的每个元素赋值来初始化内存。如果生成的代码尝试从未初始化的内存中读取,可能导致未定义的运行时行为。

另请参阅 coder.refcoder.rref

coder.wref(arg,'gpu') 指示 arg 是 GPU 参数。此选项需要有效的 GPU Coder™ 许可证。如果 coder.ceval 调用 CUDA® GPU __device__ 函数,代码生成器将忽略 'gpu' 设定。

示例

按引用将数组作为只写数组传递

假设您有一个 C 函数 init_array

void init_array(double* array, int numel) {
  for(int i = 0; i < numel; i++) {
    array[i] = 42;
  }
}

C 函数将输入变量 array 定义为指向一个双精度数的指针。

调用 C 函数 init_array 以将 y 的所有元素初始化为 42:

...
Y = zeros(5, 10);
coder.ceval('init_array', coder.wref(Y), int32(numel(Y)));
...

将多个参数作为只写引用传递

...
U = zeros(5, 10);
V = zeros(5, 10); 
coder.ceval('my_fcn', coder.wref(U), int32(numel(U)), coder.wref(V), int32(numel(V)));
...

将类属性作为只写引用传递

...
x = myClass;
x.prop = 1;
coder.ceval('foo', coder.wref(x.prop));
...

将结构体作为只写引用传递

要指示结构体类型在 C 头文件中定义,请使用 coder.cstructname

假设有一个 C 函数 init_struct。此函数写入但不读取输入参数。

#include "MyStruct.h"

void init_struct(struct MyStruct *my_struct)
{
   my_struct->f1 = 1; 
   my_struct->f2 = 2;
}

C 头文件 MyStruct.h 定义名为 MyStruct 的结构体类型:

#ifndef MYSTRUCT
#define MYSTRUCT

typedef struct MyStruct
{
    double f1;
    double f2;
} MyStruct;

void init_struct(struct MyStruct *my_struct);

#endif

在 MATLAB 函数中,将结构体作为只写引用传递给 init_struct。使用 coder.cstructname 指示 s 的结构体类型具有在 C 头文件 MyStruct.h 中定义的名称 MyStruct

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

要生成独立库代码,请输入:

codegen -config:lib foo -report

将结构体字段作为只写引用传递

...
s = struct('s1', struct('a', [0 1]));
coder.ceval('foo', coder.wref(s.s1.a));
...

您也可以传递结构体数组的元素:

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

输入参数

全部折叠

要按引用传递给外部 C/C++ 函数的参数。参数不能是类、System object™、元胞数组或元胞数组的索引。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | struct
复数支持:

限制

  • 不能按引用传递以下数据类型:

    • 类或 System object

    • 元胞数组或元胞数组索引

  • 如果某属性具有 get 方法、set 方法或验证器,或者是具有某些特性的 System object 属性,则您不能按引用将该属性传递给外部函数。请参阅Passing By Reference Not Supported for Some Properties

提示

  • 如果 arg 是数组,则 coder.wref(arg) 提供数组第一个元素的地址。coder.wref(arg) 函数不包含有关数组大小的信息。如果 C 函数需要知道数据的元素数量,请将该信息作为单独的参数进行传递。例如:

    coder.ceval('myFun',coder.wref(arg),int32(numel(arg));
    
  • 当您按引用向外部 C/C++ 函数传递结构体时,可以使用 coder.cstructname 提供在 C 头文件中定义的 C 结构体类型的名称。

  • 在 MATLAB 中,coder.wref 会导致错误。要参数化您的 MATLAB 代码以使代码能够在 MATLAB 以及生成的代码中运行,请使用 coder.target

  • 您可以使用 coder.opaque 来声明传递给外部 C/C++ 函数以及从该函数传回的变量。

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2011a 中推出