coder.rref

Укажите на данные только для чтения, чтобы передать ссылкой

Синтаксис

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));
...

Входные параметры

свернуть все

Аргумент, чтобы передать в отношении внешней функции C/C++. Аргумент не может быть классом, Система object™, массив ячеек или индекс в массив ячеек.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | struct
Поддержка комплексного числа: Да

Ограничения

  • Вы не можете передать эти типы данных ссылкой:

    • Объект класса или Системный объект

    • Массив ячеек или индекс в массив ячеек

  • Если свойство имеет получить метод, метод установки или блоки проверки допустимости, или является свойством Системного объекта с определенными атрибутами, то вы не можете передать свойство в отношении внешней функции. Смотрите Передачу Ссылкой, Не Поддержанной для Некоторых Свойств.

Советы

  • Если 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++.

Введенный в R2011a