exponenta event banner

coder.rref

Указать данные, доступные только для чтения, для передачи по ссылке

Синтаксис

Описание

пример

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
Поддержка комплексного номера: Да

Ограничения

  • Невозможно передать следующие типы данных по ссылке:

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

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

  • Если свойство имеет метод 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 + + и из нее.

Представлен в R2011a