Указать данные только для записи для передачи по ссылке
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)); ...
Невозможно передать следующие типы данных по ссылке:
Класс или системный объект
Массив ячеек или индекс в массив ячеек
Если свойство имеет метод 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 + + и из нее.
coder.ceval | coder.cstructname | coder.opaque | coder.ref | coder.rref