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

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

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

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

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

  • В приложении MATLAB Coder™, на вкладке Memory, устанавливает Dynamic memory allocation interface на Use C style EmxArray.

Чтобы узнать больше о статически выделенных массивах или динамически выделенных массивах, реализованных при помощи C, разрабатывают emxArray структура данных, смотрите Использование C Массивы в Сгенерированных Функциональных Интерфейсах.

Примеры интерфейсов функции C++ с динамически выделенными массивами

Эта таблица приводит два типичных случая для представления динамического массива в сгенерированном Коде С++. Следующий раздел объясняет определение coder::array обработайте по шаблону, который реализует динамический массив в сгенерированном коде.

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

Функция MATLAB

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

Продвиньте единицы на вектор-строку переменного размера, ограниченный в 30 000 элементов.

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

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 Шаблон класса

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

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

coder::array<int32_T, 2> myArray

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

Действие

Как к

Объявите динамический массив 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- элемент th myArray равняйтесь iИспользование:

myArray[i] = i

Примеры

Сгенерируйте код С++, который принимает и возвращает числовой массив Переменного Размера

Задайте функцию 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 как 2- размерные динамические массивы 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 в вашей текущей рабочей папке.

Сгенерируйте Код С++, который Принимает и Возвращает Вектор Переменного Размера из Символов

Задайте функцию 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 в вашей текущей рабочей папке.

Смотрите также

|

Похожие темы