В большинстве случаев, когда вы генерируете код для функции 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 Массивы в Сгенерированных Функциональных Интерфейсах.
Эта таблица приводит два типичных случая для представления динамического массива в сгенерированном Коде С++. Следующий раздел объясняет определение 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, который вы используете, чтобы создать и взаимодействовать с динамическими массивами в вашем пользовательском Коде С++.
Действие | Как к |
---|---|
Объявите динамический массив | Используйте coder::array<int32_T, 2> myArray |
Выделите память для | Используйте myArray.set_size(1, 100) Если размерность |
Доступ к вектору размера | Доступ myArray.size(1) |
Индексируйте в динамический массив | Используйте обычный синтаксис C++ в индексации массива. Например, чтобы установить 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
в вашей текущей рабочей папке.