coder.ref

Укажите данные для прохождения по ссылке

Синтаксис

Описание

пример

coder.ref(arg) указывает, что arg - выражение или переменная, которые передаются путем ссылки на внешнюю функцию C/C + +. Использоватьcoder.ref внутри coder.ceval только вызов. Функция C/C + + может считывать или записывать в переменную, переданную по ссылке. Используйте отдельнуюcoder.ref конструируйте для каждого аргумента, который вы передаете путем ссылки на функцию.

См. также coder.rref и coder.wref.

Примеры

Передайте Скалярную Переменную по ссылке

Рассмотрим функцию C addone который возвращает значение входа плюс единица:

double addone(double* p) {
  return *p + 1;
}

Функция C задает переменный вход p как указатель на двойной точности.

Передайте вход по ссылке на addone:

...
y = 0;
u = 42;
y = coder.ceval('addone', coder.ref(u));
...

Передайте несколько аргументов по ссылке

...
u = 1;
v = 2; 
y = coder.ceval('my_fcn', coder.ref(u), coder.ref(v));
...

Передайте свойство класса по ссылке

...
x = myClass;
x.prop = 1;
coder.ceval('foo', coder.ref(x.prop));
...

Передайте структуру по ссылке

Чтобы указать, что тип структуры определен в заголовочном файле на C, используйте coder.cstructname.

Предположим, что у вас есть функция C incr_struct. Эта функция читается и записывается во входной параметр.

#include "MyStruct.h"

void incr_struct(struct MyStruct *my_struct)
{
  my_struct->f1 =  my_struct->f1 + 1;
  my_struct->f2 =  my_struct->f2 + 1;
}

Заголовочный файл C, MyStruct.h, определяет тип структуры с именем MyStruct:

#ifndef MYSTRUCT
#define MYSTRUCT

typedef struct MyStruct
{
    double f1;
    double f2;
} MyStruct;

void incr_struct(struct MyStruct *my_struct);

#endif

В вашем MATLAB® function, передайте структуру путем ссылки на incr_struct. Чтобы указать, что тип структуры для s имеет имя MyStruct который определяется в заголовочном файле C MyStruct.h, использование coder.cstructname.

function y = foo
%#codegen
y = 0;
coder.updateBuildInfo('addSourceFiles','incr_struct.c');

s = struct('f1',1,'f2',2);
coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h');
coder.ceval('incr_struct', coder.ref(s));

Чтобы сгенерировать автономный код библиотеки, введите:

codegen -config:lib foo -report

Передайте поле структуры по ссылке

...
s = struct('s1', struct('a', [0 1]));
coder.ceval('foo', coder.ref(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.ref(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.ref(arg) задает адрес первого элемента массива. The coder.ref(arg) функция не содержит информацию о размере массива. Если функция C должна знать количество элементов ваших данных, передайте эту информацию как отдельный аргумент. Для примера:

    coder.ceval('myFun',coder.ref(arg),int32(numel(arg));
    
  • Когда вы передаете структуру по ссылке на внешнюю функцию C/C + +, используйтеcoder.cstructname для предоставления имени типа структуры C, заданного в заголовочном файле C.

  • В MATLAB, coder.ref приводит к ошибке. Чтобы параметризовать код MATLAB, чтобы он мог запускаться в MATLAB и в сгенерированном коде, используйте coder.target.

  • Вы можете использовать coder.opaque объявить переменные, которые вы передаете во внешнюю функцию C/C + + и обратно.

Введенный в R2011a