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® function, передайте структуру как ссылку только для чтения на 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, или validators, или является свойством системный объект с определенными атрибутами, то вы не можете передать свойство по ссылке на внешнюю функцию. Для некоторых свойств см. Раздел «Передача по ссылке» не поддерживается.

Совет

  • Если arg является массивом, тогда coder.rref(arg) задает адрес первого элемента массива. The 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