Укажите на данные, чтобы передать ссылкой
coder.ref(arg)
указывает, что 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)); ...
Вы не можете передать эти типы данных ссылкой:
Объект класса или Системный объект
Массив ячеек или индекс в массив ячеек
Если свойство имеет получить метод, метод установки или блоки проверки допустимости, или является свойством Системного объекта с определенными атрибутами, то вы не можете передать свойство в отношении внешней функции. Смотрите Передачу Ссылкой, Не Поддержанной для Some Properties.
Если 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