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