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