Для статически выделенных массивов сгенерированный код содержит определение массива и размер массива.
Например, считайте функцию 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_rows num_cols | Создает новый двумерный emxArray , но не выделяет его на куче. Вместо этого память использования, обеспеченная пользователем и наборами canFreeData к false , таким образом, это непреднамеренно не освобождает пользовательскую память, такую как стек. |
emxArray_<baseType> *emxCreateWrapperND_<baseType> (...) | данные numDimensions размер | То же самое, когда emxCreateWrapper_<baseType> , кроме него создает новый N-мерный emxArray . |
emxArray_<baseType> *emxCreate_<baseType> (...) | num_rows num_cols | Создает новый двумерный emxArray на куче, инициализированной, чтобы обнулить. Всем элементам данных задал тип данных <baseType> . |
emxArray_<baseType> *emxCreateND_<baseType> (...) | numDimensions размер | То же самое, когда emxCreate_<baseType> , кроме него создает новый N-мерный emxArray на куче. |
void emxInitArray_<baseType> (...) | **emxArray numDimensions | Создает новый пустой 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
к нулевым значениям. Для получения дополнительной информации смотрите, Включают Сгенерированный код Используя Пример Основная Функция.