Объявить переменную в созданном коде
y = coder.opaque( объявляет переменную type)y с указанным типом и без начального значения в созданном коде.
y может быть переменной или полем структуры.
Код MATLAB ® не может установить или получить доступy, но внешние функции C могут принимать y в качестве аргумента.
y может быть:
Аргумент для coder.rref, coder.wref, или coder.ref
Входной или выходной аргумент для coder.ceval
Входной или выходной аргумент для написанной пользователем функции MATLAB
Ввод в подмножество функций панели инструментов MATLAB, поддерживаемых для создания кода
Присвоение от 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.
Без этого кастинга можно получать предупреждения компилятора во время генерации кода.