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