coder.opaque

Объявите переменную в сгенерированном коде

Синтаксис

y = coder.opaque(type)
y = coder.opaque(type,value)
y = coder.opaque(___,'Size',Size)
y = coder.opaque(___,'HeaderFile',HeaderFile)

Описание

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(type,value) задает тип и начальное значение y.

пример

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, чтобы объявить переменную, которая хранит используемый by fopen/fread/fclose указателя файла. Вызов coder.opaque объявляет переменную f с типом FILE *, начальная буква value 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, чтобы протестировать на то, что успешно открыли файл.

Use 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);

Входные параметры

свернуть все

Тип переменной в сгенерированном коде. type должен быть постоянным временем компиляции. Тип должен быть a:

  • Встроенный тип данных C или тип заданы в заголовочном файле

  • C тип, который поддерживает копию присвоением

  • Легальный префикс в объявлении C

Пример: 'FILE *'

Начальное значение переменной в сгенерированном коде. value должен быть постоянным временем компиляции. Задайте выражение C, не зависящее от переменных MATLAB или функций.

Если вы не обеспечиваете начальное значение в value, инициализируйте значение переменной перед использованием его. Инициализировать переменную, объявленную с помощью coder.opaque:

  • Присвойте значение от другой переменной с тем же типом, объявленным с помощью или coder.opaque или присвоения от переменной, объявленной с помощью coder.opaque.

  • Присвойте значение от внешней функции C.

  • Передайте адрес переменной к внешней функции с помощью coder.wref.

Задайте value, который имеет тип, который задает type. В противном случае сгенерированный код может привести к неожиданным результатам.

Пример: 'NULL'

Количество байтов для переменной в сгенерированном коде, заданном как целое число. Если вы не задаете размер, размер переменной составляет 8 байтов.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Имя заголовочного файла, который содержит определение type. HeaderFile должен быть постоянным временем компиляции.

Для системного заголовочного файла используйте угловые скобки.

Пример: '<stdio.h>' generates #include <stdio.h>

Для заголовочного файла приложения используйте двойные кавычки.

Пример: '"foo.h"' генерирует #include "foo.h"

Если вы не используете угловые скобки или двойные кавычки, генератор кода производит двойные кавычки.

Пример: 'foo.h' генерирует #include "foo.h"

Задайте включать путь в параметрах конфигурации сборки.

Пример: cfg.CustomInclude = 'c:\myincludes'

Советы

  • Задайте 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
  • Можно использовать функцию cast MATLAB, чтобы бросить переменную к или от переменной, которая объявляется с помощью 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.

    Без этого кастинга возможно получить предупреждения компилятора во время генерации кода.

Введенный в R2011a