Укажите на данные только для записи, чтобы передать ссылкой
coder.wref(arg)
указывает, что coder.wref(arg)
arg
является выражением только для записи или переменной, чтобы передать в отношении внешней функции C/C++. Используйте coder.wref
только в вызове coder.ceval
. Эта функция позволяет генератору кода оптимизировать сгенерированный код путем игнорирования предшествующих присвоений на arg
в коде MATLAB®, потому что внешняя функция принята, чтобы не читать из данных. Запишите во все элементы arg
в вашем внешнем коде, чтобы полностью инициализировать память.
Функция C/C++ должна полностью инициализировать память, на которую ссылается coder.wref(arg)
. Инициализируйте память путем присвоения значений каждому элементу arg
в коде C/C++. Если сгенерированный код пытается читать из неинициализированной памяти, он может вызвать неопределенное поведение во время выполнения.
См. также coder.ref
и coder.rref
rref.
Предположим, что у вас есть функция C init_array
.
void init_array(double* array, int numel) { for(int i = 0; i < numel; i++) { array[i] = 42; } }
Функция C задает входную переменную array
как указатель на двойное.
Вызовите функцию C init_array
, чтобы инициализировать все элементы y
к 42:
... Y = zeros(5, 10); coder.ceval('init_array', coder.wref(Y), int32(numel(Y))); ...
... U = zeros(5, 10); V = zeros(5, 10); coder.ceval('my_fcn', coder.wref(U), int32(numel(U)), coder.wref(V), int32(numel(V))); ...
... x = myClass; x.prop = 1; coder.ceval('foo', coder.wref(x.prop)); ...
Чтобы указать, что тип структуры задан в заголовочном файле C, используйте coder.cstructname
.
Предположим, что у вас есть функция C init_struct
. Эта функция пишет во входной параметр, но не читает из него.
#include "MyStruct.h" void init_struct(struct MyStruct *my_struct) { my_struct->f1 = 1; my_struct->f2 = 2; }
Заголовочный файл C, MyStruct.h
, задает тип структуры, названный MyStruct
:
#ifndef MYSTRUCT #define MYSTRUCT typedef struct MyStruct { double f1; double f2; } MyStruct; void init_struct(struct MyStruct *my_struct); #endif
В вашей функции MATLAB передайте структуру как ссылку только для записи на init_struct
. Используйте coder.cstructname
, чтобы указать, что тип структуры для s
имеет имя MyStruct
, который задан в заголовочном файле C MyStruct.h
h.
function y = foo %#codegen y = 0; coder.updateBuildInfo('addSourceFiles','init_struct.c'); s = struct('f1',1,'f2',2); coder.cstructname(s,'MyStruct','extern','HeaderFile','MyStruct.h'); coder.ceval('init_struct', coder.wref(s));
Чтобы сгенерировать автономный код библиотеки, войдите:
codegen -config:lib foo -report
... s = struct('s1', struct('a', [0 1])); coder.ceval('foo', coder.wref(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.wref(a.b(3,4).c(2).u)); ...
Вы не можете передать эти типы данных ссылкой:
Объект класса или Системный объект
Массив ячеек или индекс в массив ячеек
Если свойство имеет получить метод, метод установки или блоки проверки допустимости, или является свойством Системного объекта с определенными атрибутами, то вы не можете передать свойство в отношении внешней функции. Смотрите Передачу Ссылкой, Не Поддержанной для Some Properties.
Если arg
является массивом, то coder.wref(arg)
обеспечивает адрес первого элемента массива. Функция coder.wref(arg)
не содержит информацию о размере массива. Если функция C должна знать число элементов ваших данных, передайте ту информацию в качестве отдельного аргумента. Например:
coder.ceval('myFun',coder.wref(arg),int32(numel(arg));
Когда вы передаете структуру в отношении внешней функции C/C++, используйте coder.cstructname
, чтобы обеспечить имя типа структуры C, который задан в заголовочном файле C.
В MATLAB coder.wref
приводит к ошибке. Чтобы параметризовать ваш код MATLAB так, чтобы это могло запуститься в MATLAB и в сгенерированном коде, используйте coder.target
.
Можно использовать coder.opaque
, чтобы объявить переменные, которые вы передаете и от внешней функции C/C++.
coder.ceval
| coder.cstructname
| coder.opaque
| coder.ref
| coder.rref