Интерфейс кода С для массивов

Интерфейс кода С для статически выделенных массивов

Для статически выделенных массивов сгенерированный код содержит определение массива и размер массива.

Например, считайте функцию 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 является семейством типов данных, специализированных для всех базовых типов.

Определение Структуры 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

Булев флаг, указывающий, как освободить память:

  • tRUE MATLAB освобождает память автоматически

  • ложь Вызов программы определяет, когда освободить память

Служебные функции для Создания emxArray Структуры данных

Когда вы генерируете код, который использует данные переменного размера, экспорт генератора кода набор служебных функций, которые можно использовать, чтобы создать и взаимодействовать с 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 к нулевым значениям. Для получения дополнительной информации смотрите, Включают Сгенерированный код Используя Пример Основная Функция.

Была ли эта тема полезной?