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