Объявить переменную в сгенерированном коде
y = coder.opaque(
объявляет переменную type
)y
с заданным типом и без начального значения в сгенерированном коде.
y
может быть переменной или структурным полем.
MATLAB® код не может установить или получить доступ к y
, но внешние функции C могут принимать y
как аргумент.
y
может быть:
Аргумент в coder.rref
, coder.wref
, или coder.ref
Входной или выходной аргумент для coder.ceval
Входной или выходной аргумент в пользовательскую функцию MATLAB
Вход в подмножество функций MATLAB toolbox, поддерживаемых для генерации кода
Назначение из y
объявляет другую переменную с тем же типом в сгенерированном коде. Для примера:
y = coder.opaque('int'); z = y;
z
типа int
в сгенерированном коде.Можно назначить y
от другой переменной, объявленной с использованием coder.opaque
или назначение из переменной, объявленной с помощью coder.opaque
. Переменные должны иметь одинаковые типы.
Можно сравнить y
к другой переменной, объявленной с использованием любой из coder.opaque
или назначение из переменной, объявленной с помощью coder.opaque
. Переменные должны иметь одинаковые типы.
y = coder.opaque(___,'Size',
задает размер в байтах Size
)y
. Размер можно задать с помощью любого из предыдущих синтаксисов.
y = coder.opaque(___,'HeaderFile',
задает заголовочный файл, содержащий определение типа. Генератор кода производит HeaderFile
)#include
оператор для заголовочного файла, где оператор требуется в сгенерированном коде. Можно задать заголовочный файл с любым из предыдущих синтаксисов.
Сгенерируйте код для valtest функции
который возвращает 1
если вызов на myfun
успешно. Эта функция использует coder.opaque
для объявления переменной x1
с типом int
и начальное значение 0
. Назначение x2 = x1
объявляет x2
быть переменной с типом и начальным значением x1
.
Напишите функцию valtest
.
function y = valtest %codegen %declare x1 to be an integer with initial value '0' x1 = coder.opaque('int','0'); %Declare x2 to have same type and initial value as x1 x2 = x1; x2 = coder.ceval('myfun'); %test the result of call to 'myfun' by comparing to value of x1 if x2 == x1 y = 0; else y = 1; end end
Сгенерируйте код для функции MATLAB filetest
который возвращает собственный исходный код, используя fopen/fread/fclose
. Эта функция использует coder.opaque
объявить переменную, которая хранит указатель на файл, используемый fopen/fread/fclose
. Вызов coder.opaque
объявляет переменную f
с типом FILE *
, начальное значение NULL
и заголовочный файл <stdio.h>
.
Написание функции MATLAB filetest
.
function buffer = filetest %#codegen % Declare 'f' as an opaque type 'FILE *' with initial value 'NULL" %Specify the header file that contains the type definition of 'FILE *'; f = coder.opaque('FILE *', 'NULL','HeaderFile','<stdio.h>'); % Open file in binary mode f = coder.ceval('fopen', cstring('filetest.m'), cstring('rb')); % Read from file until end of file is reached and put % contents into buffer n = int32(1); i = int32(1); buffer = char(zeros(1,8192)); while n > 0 % By default, MATLAB converts constant values % to doubles in generated code % so explicit type conversion to int32 is inserted. n = coder.ceval('fread', coder.ref(buffer(i)), int32(1), ... int32(numel(buffer)), f); i = i + n; end coder.ceval('fclose',f); buffer = strip_cr(buffer); % Put a C termination character '\0' at the end of MATLAB character vector function y = cstring(x) y = [x char(0)]; % Remove all character 13 (CR) but keep character 10 (LF) function buffer = strip_cr(buffer) j = 1; for i = 1:numel(buffer) if buffer(i) ~= char(13) buffer(j) = buffer(i); j = j + 1; end end buffer(i) = 0;
coder.opaque
Сравнение переменных, объявленных с помощью coder.opaque
для проверки на успешное открытие файла.
Использование coder.opaque
для объявления переменной null
с типом FILE *
и начальное значение NULL
.
null = coder.opaque('FILE *', 'NULL', 'HeaderFile', '<stdio.h>');
Используйте назначение, чтобы объявить другую переменную ftmp
с тем же типом и значением, что и null
.
ftmp = null; ftmp = coder.ceval('fopen', ['testfile.txt', char(0)], ['r', char(0)]);
Сравните переменные.
if ftmp == null %error condition end
coder.opaque
В этом примере показано, как перенести в и из типов переменных, которые объявлены как использующие coder.opaque
. Функция castopaque
вызывает функцию во время выполнения на C strncmp
сравнить самое большее n
символы строк s1
и s2
. n
- количество символов в меньшей части строк. Чтобы сгенерировать правильный тип C для strncmp
входной nsizet
функция приводит n
к типу C size_t
и присваивает результат nsizet
. Функция использует coder.opaque
объявить nsizet
. Перед использованием выхода retval
от strncmp
функция приводит retval
к типу MATLAB int32
и сохраняет результаты в y
.
Напишите эту функцию MATLAB:
function y = castopaque(s1,s2) % <0 - the first character that does not match has a lower value in s1 than in s2 % 0 - the contents of both strings are equal % >0 - the first character that does not match has a greater value in s1 than in s2 % %#codegen coder.cinclude('<string.h>'); n = min(numel(s1), numel(s2)); % Convert the number of characters to compare to a size_t nsizet = cast(n,'like',coder.opaque('size_t','0')); % The return value is an int retval = coder.opaque('int'); retval = coder.ceval('strncmp', cstr(s1), cstr(s2), nsizet); % Convert the opaque return value to a MATLAB value y = cast(retval, 'int32'); %-------------- function sc = cstr(s) % NULL terminate a MATLAB character vector for C sc = [s, char(0)];
Сгенерируйте MEX-функцию.
codegen castopaque -args {blanks(3), blanks(3)} -report
Вызовите MEX-функцию с входами 'abc'
и 'abc'
.
castopaque_mex('abc','abc')
ans = 0
Выходные выходы 0
потому что строки равны.
Вызовите MEX-функцию с входами 'abc'
и 'abd'
.
castopaque_mex('abc','abd')
ans = -1
Выходные выходы -1
потому что третий символ d
во второй строке больше, чем третий символ c
в первой строке.
Вызовите MEX-функцию с входами 'abd'
и 'abc'
.
castopaque_mex('abd','abc')
ans = 1
Выходные выходы 1
потому что третий символ d
в первой строке больше, чем третий символ c
во второй строке.
В рабочем пространстве MATLAB можно увидеть, что тип y
является int32
.
Объявить y
быть 4-байтовым целым числом с начальным значением 0.
y = coder.opaque('int','0', 'Size', 4);
Задайте value
который имеет тип, который type
задает. В противном случае сгенерированный код может привести к неожиданным результатам. Для примера, следующее coder.opaque
объявление может привести к неожиданным результатам.
y = coder.opaque('int', '0.2')
coder.opaque
объявляет тип переменной. Он не создает экземпляр переменной. Вы можете создать экземпляр переменной, используя его позже в коде MATLAB. В следующем примере назначение fp1
от coder.ceval
создает экземпляры fp1
.
% Declare fp1 of type FILE * fp1 = coder.opaque('FILE *'); %Create the variable fp1 fp1 = coder.ceval('fopen', ['testfile.txt', char(0)], ['r', char(0)]);
В среде MATLAB, coder.opaque
возвращает значение, заданное в value
. Если value
не предусмотрен, он возвращает пустой символьный вектор.
Можно сравнить переменные, объявленные с помощью одного из coder.opaque
или назначение из переменной, объявленной с помощью coder.opaque
. Переменные должны иметь одинаковые типы. Следующий пример демонстрирует, как сравнить эти переменные. Сравнение переменных, объявленных с использованием coder.opaque
Чтобы избежать нескольких включений одного и того же заголовочного файла в сгенерированный код, заключайте заголовочный файл в условные операторы препроцессора #ifndef
и #endif
. Для примера:
#ifndef MyHeader_h #define MyHeader_h <body of header file> #endif
Можно использовать MATLAB cast
функция для приведения переменной в или из переменной, которая объявлена как coder.opaque
. Использовать cast
с coder.opaque
только для числовых типов.
Чтобы привести переменную, объявленную coder.opaque
для типа MATLAB можно использовать B = cast(A,type)
синтаксис. Для примера:
x = coder.opaque('size_t','0'); x1 = cast(x, 'int32');
Можно также использовать B = cast(A,'like',p)
синтаксис. Для примера:
x = coder.opaque('size_t','0'); x1 = cast(x, 'like', int32(0));
Чтобы привести переменный MATLAB к типу переменной, объявленной coder.opaque
, вы должны использовать B = cast(A,'like',p)
синтаксис. Для примера:
x = int32(12); x1 = coder.opaque('size_t', '0'); x2 = cast(x, 'like', x1));
Использовать cast
с coder.opaque
чтобы сгенерировать правильные типы данных для:
Входы в функции C/C + +, которые вы вызываете используяcoder.ceval
.
Переменные, которые вы присваиваете выходам из функций C/C + +, которые вы вызываете используяcoder.ceval
.
Без этого кастинга возможно получать предупреждения компилятора во время генерации кода.