Указать данные для передачи по ссылке
coder.ref( указывает, что arg)arg - выражение или переменная, передаваемые по ссылке на внешнюю функцию C/C + +. Использоватьcoder.ref внутри coder.ceval только вызов. Функция C/C + + может считывать или записывать переменную, передаваемую по ссылке. Использовать отдельныйcoder.ref для каждого аргумента, передаваемого по ссылке на функцию.
См. также coder.rref и coder.wref.
Рассмотрим функцию C addone возвращает значение входного значения плюс один:
double addone(double* p) {
return *p + 1;
}Функция C определяет входную переменную p как указатель на двойник.
Передача входных данных по ссылке на addone:
... y = 0; u = 42; y = coder.ceval('addone', coder.ref(u)); ...
... u = 1; v = 2; y = coder.ceval('my_fcn', coder.ref(u), coder.ref(v)); ...
... x = myClass; x.prop = 1; coder.ceval('foo', coder.ref(x.prop)); ...
Чтобы указать, что тип структуры определен в файле заголовка C, используйте coder.cstructname.
Предположим, что у вас есть функция C incr_struct. Эта функция считывает из и записывает во входной аргумент.
#include "MyStruct.h"
void incr_struct(struct MyStruct *my_struct)
{
my_struct->f1 = my_struct->f1 + 1;
my_struct->f2 = my_struct->f2 + 1;
}файл заголовка C, MyStruct.h, определяет тип структуры с именем MyStruct:
#ifndef MYSTRUCT
#define MYSTRUCT
typedef struct MyStruct
{
double f1;
double f2;
} MyStruct;
void incr_struct(struct MyStruct *my_struct);
#endifВ функции MATLAB ® передайте структуру по ссылке наincr_struct. Чтобы указать, что тип структуры для s имеет имя MyStruct который определен в файле заголовка C MyStruct.h, использовать coder.cstructname.
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','incr_struct.c'); s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); coder.ceval('incr_struct', coder.ref(s));
Для создания кода автономной библиотеки введите:
codegen -config:lib foo -report
... s = struct('s1', struct('a', [0 1])); coder.ceval('foo', coder.ref(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.ref(a.b(3,4).c(2).u)); ...
Невозможно передать следующие типы данных по ссылке:
Класс или системный объект
Массив ячеек или индекс в массив ячеек
Если свойство имеет метод get, метод set или средства проверки или является свойством объекта System с определенными атрибутами, то нельзя передать свойство по ссылке на внешнюю функцию. См. раздел Передача по ссылке, не поддерживаемой для некоторых свойств.
Если arg является массивом, то coder.ref(arg) предоставляет адрес первого элемента массива. coder.ref(arg) не содержит сведений о размере массива. Если функция C должна знать количество элементов данных, передайте эту информацию в качестве отдельного аргумента. Например:
coder.ceval('myFun',coder.ref(arg),int32(numel(arg));
При передаче структуры по ссылке на внешнюю функцию C/C + + используйтеcoder.cstructname для предоставления имени типа структуры C, определенного в файле заголовка C.
В MATLAB, coder.ref приводит к ошибке. Чтобы параметризовать код MATLAB так, чтобы он мог выполняться в MATLAB и в сгенерированном коде, используйте coder.target.
Вы можете использовать coder.opaque для объявления переменных, передаваемых во внешнюю функцию C/C + + и из нее.
coder.ceval | coder.cstructname | coder.opaque | coder.rref | coder.wref | numel