Для статически выделенных массивов сгенерированный код содержит определение массива и размер массива.
Например, считайте функцию MATLAB® myuniquetol.
function B = myuniquetol(A, tol) %#codegen A = sort(A); coder.varsize('B', [1 100], [0 1]); B = A(1); k = 1; for i = 2:length(A) if abs(A(k) - A(i)) > tol B = [B A(i)]; k = i; end end
Оператор coder.varsize('B', [1 100], [0 1]) указывает, что B является массивом переменного размера, первая размерность которого фиксируется в 1, и второе измерение может отличаться до 100 элементов. Без этого оператора B является динамически выделенным массивом.
Сгенерируйте код для myuniquetol, задающего, что входной параметр, A является переменным размером действительный двойной вектор, первая размерность которого фиксируется в 1 и второе измерение, может отличаться до 100 элементов.
codegen -config:lib -report myuniquetol -args {coder.typeof(0,[1 100],1),coder.typeof(0)} В сгенерированном коде объявление функции:
extern void myuniquetol(const double A_data[], const int A_size[2], double tol, double B_data[], int B_size[2])
Функциональная подпись объявляет входной параметр A и выходной аргумент B. A_size содержит размер A. B_size содержит размер B после вызова myuniquetol. Используйте B_size, чтобы определить число элементов B, к которому можно получить доступ после вызова myuniquetol. B_size[0] содержит размер первой размерности. B_size[1] содержит размер второго измерения. Поэтому числом элементов B является B_size[0]*B_Size[1]. Даже при том, что B имеет элементы 100 в коде С, только элементы B_size[0]*B_Size[1] содержат допустимые данные.
Следующая основная функция C показывает, как вызвать myuniquetol.
void main()
{
double A[100], B[100];
int A_size[2] = { 1, 100 };
int B_size[2];
int i;
for (i = 0; i < 100; i++) {
A[i] = (double)1/i;
}
myuniquetol(A, A_size, 0.1, B, B_size);
}
В сгенерированном коде MATLAB представляет динамически выделенные данные как тип структуры под названием emxArray. Встраиваемая версия mxArray MATLAB, emxArray является семейством типов данных, специализированных для всех базовых типов.
typedef struct emxArray_<baseTypedef>
{
<baseType> *data;
int *size;
int allocatedSize;
int numDimensions;
boolean_T canFreeData;
} emxArray_<baseTypedef>;baseTypedef является предварительно определенным типом в rtwtypes.h, соответствующем baseType. Например, вот является определение для emxArray базового типа double с неизвестными верхними границами:
typedef struct emxArray_real_T
{
double *data;
int *size;
int allocatedSize;
int numDimensions;
boolean_T canFreeData;
} emxArray_real_T;Предварительно определенным типом, соответствующим double, является real_T. Для получения дополнительной информации о соответствии между встроенными типами данных и предварительно определенными типами в rtwtypes.h, смотрите Отображение Типы MATLAB к Типам в Сгенерированном коде.
Чтобы задать две переменные, in1 и in2, этого типа, используют этот оператор:
emxArray_real_T *in1, *in2;
| Поле | Описание |
|---|---|
данные | Указатель на данные типа <базовый тип>. |
размер | Указатель на первый элемент вектора размера. Длина вектора равняется количеству размерностей. |
allocatedSize | Число элементов в настоящее время выделяется для массива. Если размер изменяется, MATLAB перераспределяет память на основе нового размера. |
numDimensions | Количество размерностей вектора размера, то есть, количество размерностей можно получить доступ, не пересекаясь в освобожденную или неиспользованную память. |
canFreeData |
Булев флаг, указывающий, как освободить память:
|
Когда вы генерируете код, который использует данные переменного размера, экспорт генератора кода набор служебных функций, которые можно использовать, чтобы создать и взаимодействовать с emxArrays в сгенерированном коде. Чтобы вызвать эти функции в вашей основной функции C, включайте сгенерированный заголовочный файл. Например, когда вы генерируете код для функционального foo, включаете foo_emxAPI.h в вашу основную функцию C. Для получения дополнительной информации смотрите раздел “Write a C Main Function” в Использовании Динамического выделения памяти для Моделирования "Атомов".
Служебные функции emxArray экспорта генератора кода только для массивов переменного размера, которые являются аргументами функции точки входа или которые используются функциями, вызванными coder.ceval.
| Функция | Аргументы | Описание |
|---|---|---|
emxArray_<baseType> *emxCreateWrapper_<baseType> (...) | данныеnum_rowsnum_cols | Создает новый двумерный emxArray, но не выделяет его на куче. Вместо этого память использования, обеспеченная пользователем и наборами canFreeData к false, таким образом, это непреднамеренно не освобождает пользовательскую память, такую как стек. |
emxArray_<baseType> *emxCreateWrapperND_<baseType> (...) | данныеnumDimensionsразмер | То же самое, когда emxCreateWrapper_<baseType>, кроме него создает новый N-мерный emxArray. |
emxArray_<baseType> *emxCreate_<baseType> (...) | num_rowsnum_cols | Создает новый двумерный emxArray на куче, инициализированной, чтобы обнулить. Всем элементам данных задал тип данных <baseType>. |
emxArray_<baseType> *emxCreateND_<baseType> (...) | numDimensionsразмер | То же самое, когда emxCreate_<baseType>, кроме него создает новый N-мерный emxArray на куче. |
void emxInitArray_<baseType> (...) | **emxArraynumDimensions | Создает новый пустой emxArray на куче. Всем элементам данных задал тип данных <baseType>. |
void emxInitArray_<structType> (...) | Структура | Создает пустой emxArray s в структуре. |
void emxDestroyArray_<baseType> (...) | *emxArray | Освобождает динамическую память, выделенную emxCreate_<baseType>, emxCreateND_<baseType> и функциями emxInitArray_baseType. |
void emxDestroyArray_<structType> (...) | Структура | Освобождает динамическую память, выделенную функциями emxInitArray_<structType>. |
По умолчанию, когда вы генерируете исходный код C/C++, статические библиотеки, динамические библиотеки и исполняемые файлы, MATLAB Coder™ генерирует пример C/C++ основная функция. Основная функция примера является шаблоном, который может помочь вам включить сгенерированный код C/C++ в свое приложение. Если вы генерируете код, который использует динамически выделенные данные, пример, основная функция включает вызовы служебных функций emxArray, которые создают emxArrays, требуемый для этого данные. Пример основная функция также инициализирует данные emxArray к нулевым значениям. Для получения дополнительной информации смотрите, Включают Сгенерированный код Используя Пример Основная Функция.