exponenta event banner

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 или средства проверки или является свойством объекта System с определенными атрибутами, то нельзя передать свойство по ссылке на внешнюю функцию. См. раздел Передача по ссылке, не поддерживаемой для некоторых свойств.

Совет

  • Если 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 + + и из нее.

Представлен в R2011a