coder.wref

Укажите данные только для записи, чтобы пройти по ссылке

Синтаксис

Описание

пример

coder.wref(arg) указывает, что arg является выражением или переменной только для записи, которые передаются путем ссылки на внешнюю функцию C/C + +. Использоватьcoder.wref только внутри coder.ceval вызов. Эта функция позволяет генератору кода оптимизировать сгенерированный код, игнорируя предыдущие назначения arg в вашем MATLAB® код, поскольку внешняя функция принята не считанной из данных. Запись во все элементы arg во внешнем коде, чтобы полностью инициализировать память.

Примечание

Функция C/C + + должна полностью инициализировать память, на которую ссылаются coder.wref(arg). Инициализируйте память, присвоив значения каждому элементу arg в коде C/C + +. Если сгенерированный код пытается считать из неинициализированной памяти, это может вызвать неопределенное поведение во время выполнения.

См. также coder.ref и coder.rref.

Примеры

Передайте массив по ссылке только для записи

Предположим, что у вас есть функция 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 имеет имя MyStruct который определяется в заголовочном файле C MyStruct.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));

Чтобы сгенерировать автономный код библиотеки, введите:

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 + +. Аргумент не может быть классом, системной object™, массивом ячеек или индексом в массив ячеек.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | struct
Поддержка комплексного числа: Да

Ограничения

  • Вы не можете передать эти типы данных по ссылке:

    • Класс или Системный объект

    • Массив ячеек или индекс в массив ячеек

  • Если свойство имеет метод get, метод set, или validators, или является свойством системный объект с определенными атрибутами, то вы не можете передать свойство по ссылке на внешнюю функцию. Для некоторых свойств см. Раздел «Передача по ссылке» не поддерживается.

Совет

  • Если arg является массивом, тогда coder.wref(arg) задает адрес первого элемента массива. The 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 + + и обратно.

Введенный в R2011a