exponenta event banner

кодер. 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™, массив ячеек или индекс в массив ячеек.

Типы данных: единственный | удваиваются | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический | char | struct
Поддержка комплексного числа: Да

Ограничения

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

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

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

  • Если свойство имеет получить метод, метод установки или блоки проверки допустимости, или является свойством Системного объекта с определенными атрибутами, то вы не можете передать свойство в отношении внешней функции. Смотрите Передачу Ссылкой, Не Поддержанной для 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++.

Введенный в R2011a