Укажите данные для прохождения по ссылке
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® function, передайте структуру путем ссылки на 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, или validators, или является свойством системный объект с определенными атрибутами, то вы не можете передать свойство по ссылке на внешнюю функцию. Для некоторых свойств см. Раздел «Передача по ссылке» не поддерживается.
Если arg
является массивом, тогда coder.ref(arg)
задает адрес первого элемента массива. The 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