exponenta event banner

Использование динамически распределенных массивов C++ в генерируемых функциональных интерфейсах

В большинстве случаев при создании кода для функции MATLAB ®, которая принимает или возвращает массив, в интерфейсе созданной функции C/C + + имеется массив. Для размера массива, который неизвестен во время компиляции или граница которого превышает предопределенный порог, память для созданного массива динамически выделяется в куче. В противном случае память генерируемого массива статически выделяется в стеке. См. раздел Управление выделением памяти для массивов переменного размера.

Если в качестве целевого языка для создания кода выбран C++, по умолчанию динамически выделенный массив реализуется как шаблон класса с именем coder::array в созданном коде. Чтобы использовать динамически выделенные массивы в пользовательском коде C++, интегрированном с сгенерированными функциями C++, научитесь использовать coder::array шаблон.

По умолчанию сгенерированный код C++ использует coder::array шаблон для реализации динамически распределенных массивов. Вместо этого можно создать код C++, использующий стиль C emxArray структура данных для реализации динамически распределенных массивов. Создание стиля C emxArray выполните одно из следующих действий:

  • В объекте конфигурации кода (coder.MexCodeConfig, coder.CodeConfig, или coder.EmbeddedCodeConfig), установите DynamicMemoryAllocationInterface параметр для 'C'.

  • В приложении MATLAB Coder™ на вкладке «Память» установите для параметра Динамический интерфейс выделения памяти значение Use C style EmxArray.

Дополнительные сведения о статически распределенных массивах или динамически распределенных массивах, реализованных с использованием стиля C emxArray см. раздел Использование массивов C в генерируемых интерфейсах функций.

Примеры функциональных интерфейсов C++, использующих динамически распределенные массивы

В этой таблице перечислены два типичных варианта представления динамического массива в сгенерированном коде C++. Для определения coder::array шаблон, реализующий динамические массивы в сгенерированном коде, см. в разделе Использование кодера:: Шаблон класса массива.

Описание алгоритма и размер массива

Функция MATLAB

Сгенерированный функциональный интерфейс C++

Поместите их на вектор строки переменного размера, ограниченный 30000 элементами.

Переменный размер, не ограниченный порогом.

function B = create_vec2 %#codegen
B = zeros(1,0);
coder.varsize('B',[1 30000],[0 1]);
for i = 1:500
    if round(rand)
        B = [1 B];
    end
end
void create_vec2(coder::array<double, 2U> &B)

Создайте массив с размером, определяемым неограниченным целочисленным вводом.

Неизвестно во время компиляции.

function y = create_vec3(n) %#codegen
y = int8(ones(1,n));
void create_vec3(double n, coder::array<signed char, 2U> &y)

Использование coder::array Шаблон класса

При создании кода C++ для функций MATLAB генератор кода создает файл заголовка. coder_array.h в папке построения. Этот файл заголовка содержит определение шаблона класса array в пространстве имен coder. coder::array шаблон реализует динамически назначенные массивы в сгенерированном коде. Объявление для этого шаблона:

template <typename T, int32_T N> class array
Массив содержит элементы типа T и имеет N размеры. Например, объявление двумерного динамического массива myArray который содержит элементы типа int32_T в пользовательском коде C++ используйте:

coder::array<int32_T, 2> myArray

Чтобы использовать динамически выделенные массивы в пользовательском коде C++, который требуется интегрировать с сгенерированным кодом (например, пользовательская основная функция), включите coder_array.h заголовочный файл в пользовательском .cpp файлы. В этой таблице показан API, используемый для создания динамических массивов в пользовательском коде C++ и взаимодействия с ними.

Действие

Инструкции

Объявление динамического массива myArray который содержит элементы типа int32_T. Задать количество размеров myArray кому 2.

Используйте coder::array шаблон. Укажите тип элемента и количество размеров.

coder::array<int32_T, 2> myArray

Выделить память для myArray. Задайте размер первого размера равным 1 и второе измерение для 100.

Используйте set_size способ.

myArray.set_size(1, 100)

Если размер myArray В дальнейшем во время выполнения созданный код перераспределяет память на основе нового размера.

Доступ к вектору размера myArray.

Доступ к size массив, который является членом данных myArray. Например, чтобы получить доступ к размеру второго размера myArray, использовать:

myArray.size(1)

Индексировать в динамический массив myArray.

Используйте стандартный синтаксис C++ для индексирования массива. Например, для установки i-й элемент myArray равно i, использовать:

myArray[i] = i

Примеры

Создать код C++, принимающий и возвращающий числовой массив переменного размера

Определение функции MATLAB xTest1 который принимает массив X, добавляет скаляр A к каждому из его элементов и возвращает результирующий массив Y.

function Y = xTest1(X, A)
Y = X;
for i = 1:numel(X)
    Y(i) = X(i) + A;
end

Целью является создание исполняемого файла C++ для xTest1 которые могут принимать и возвращать массив int32_T элементы. Необходимо, чтобы первое измерение массива было одиночным, а второе измерение - неограниченным.

Определение основной функции C++ в файле xTest1_main.cpp в текущей рабочей папке.

#include<iostream>
#include<coder_array.h>
#include<xTest1.h>

int main(int argc, char *argv[])
{
    static_cast<void>(argc);
    static_cast<void>(argv);

    coder::array<int32_T, 2> myArray;
    myArray.set_size(1, 100);
    for (int i = 0; i < myArray.size(1); i++) {
        myArray[i] = i;
    }

    coder::array<int32_T, 2> myResult;
    xTest1(myArray, 1000, myResult);

    for (int i = 0; i < myResult.size(1); i++) {
        if (i > 0) std::cout << " ";
        std::cout << myResult[i];
        if (((i+1) % 10) == 0) std::cout << std::endl;
    }
    std::cout << std::endl;

    return 0;
}

Эта основная функция включает файл заголовка coder_array.h , который содержит coder::array определение шаблона класса. Основная функция использует API, описанный в таблице в предыдущем разделе, для выполнения следующих действий:

  • Объявить myArray и myResult как двумерные динамические массивы int32_T элементы.

  • Динамически задавать размеры двух размеров myArray кому 1 и 100 с помощью set_size способ.

  • Доступ к вектору размера myResult с помощью myResult.size.

Создайте код, запустив этот сценарий. Заменить 'C:\work' с путем к текущей рабочей папке.

cfg = coder.config('exe'); cfg.TargetLang = 'C++';
cfg.CustomSource = 'xTest1_main.cpp';
cfg.CustomInclude = 'C:\work';
codegen -config cfg -args { coder.typeof(int32(0), [1 inf]), int32(0)} xTest1_main.cpp xTest1.m -report

Генератор кода создает исполняемый файл xTest1.exe в текущей рабочей папке.

Создать код C++, принимающий и возвращающий вектор переменной величины символов

Определение функции MATLAB xStringTest который принимает символьный вектор str, вставки str между векторами символов 'hello ' и ' world!'и возвращает результат. Ваша цель - создать исполняемый файл C++ из xStringTest.

function y = xStringTest(str)
assert(isa(str, 'char'));
assert(size(str,1) == 1);
assert(size(str,2) >= 0);
y = ['hello ' str ' world!'];

Определение основной функции C++ в файле xStringTest_main.cpp в текущей рабочей папке. Эта основная функция использует std::vector для объявления вектора vec из char_T элементы, передаваемые сгенерированной функции C++ xStringTest.

#include<iostream>
#include<coder_array.h>
#include<xTest1.h>

int main(int, char *[])
{
    coder::array<char_T, 2> result;
    
    std::vector<char_T> vec;
    vec.resize(10);
    for (size_t i = 0; i < 10; i++) {
        vec[i] = static_cast<char_T>('A' + i);
    }
    
    xStringTest(vec, result);
    
    std::cout << "Result is " << static_cast<std::string>(result) << std::endl;
    
    return 0;
}

Создайте код, запустив этот сценарий. Заменить 'C:\work' с текущей рабочей папкой.

cfg = coder.config('exe'); cfg.TargetLang = 'C++';
cfg.CustomSource = 'xStringTest_main.cpp';
cfg.CustomInclude = 'C:\work';
codegen -config cfg -args {coder.typeof(char('X'), [1 inf])} xStringTest_main.cpp xStringTest.m -report

Генератор кода создает исполняемый файл xStringTest.exe в текущей рабочей папке.

См. также

|

Связанные темы