Как использовать библиотеку C, созданную MATLAB Coder codegen в программе C с аргументами emxArray?

Функция C (статическая библиотека C), созданная codegen, принимает входной аргумент типа const emxArray_uint32_T и возвращает значения типа emxArray_struct_T. Как предполагает тип, input - это массив uint32, а output - это массив struct.

Я не уверен, как использовать эту функцию в моей C-программе. Для ввода я должен объявить массив типа uint32_T или использовать тип emxArray_uint32_T? Для вывода, поскольку я не знаю размер выходного массива, как объявить массив struct для получения возвращаемых значений из функции?

Я поставил вопрос в ответах MATLAB, но не повезло..

Спасибо!

2 ответа

Решение

Если вы использовали C++, emxArray типы данных похожи на сгенерированные эквиваленты C std::vector, А именно, именно так сгенерированный код представляет динамически распределяемые массивы. Они хранят данные и указатели размера, а также некоторые другие детали.

Если вы посмотрите в каталог, где вы сгенерировали код, вы должны найти файл с именем <functionName>_emxAPI.h, Этот файл объявляет некоторые служебные функции, которые создают и разрушают emxArray значения проще. Используя их для создания emxArray Значения обеспечивают правильную инициализацию всех полей и защищают ваш код от любых возможных изменений emxArray тип.

В примере, который я сделал, который принимает массив uint32 значения, а также возвращает такой массив, я вижу следующие функции:

extern emxArray_uint32_T *emxCreateWrapperND_uint32_T(unsigned int *data, int
                                                      numDimensions, int *size);
extern emxArray_uint32_T *emxCreateWrapper_uint32_T(unsigned int *data, int rows,
                                                    int cols);
extern emxArray_uint32_T *emxCreateND_uint32_T(int numDimensions, int *size);
extern emxArray_uint32_T *emxCreate_uint32_T(int rows, int cols);
extern void emxDestroyArray_uint32_T(emxArray_uint32_T *emxArray);

Первые четыре функции могут быть использованы для создания emxArray ценности в разных ситуациях.

Первая пара, т.е. emxCreateWrapper_uint32_T, emxCreateWrapperND_uint32_T, может быть использован для создания uint32emxArray с указанным количеством размеров и размеров из существующих данных. Так что, если у вас уже есть входные данные, выделенные в некоторой памяти, эти функции упаковывают эти данные в emxArray указанного размера без выделения дополнительной памяти для ваших данных.

/* Create a 10-by-10 C array of uint32 values and wrap an emxArray around it */
uint32_T x[100];
emxArray *pEmx = NULL;
int k = 0;
for (k = 0; k < 100; k++) {
    x[k] = (uint32_T) k;
}

pEmx = emxCreateWrapper_uint32_T(x, 10, 10);

/* Use pEmx here*/

/* Deallocate any memory allocated in pEmx. */
/* This DOES NOT free pEmx->data because the "wrapper" function was used */
emxDestroyArray_uint32_T(pEmx);

Вторая пара, т.е. emxCreate_uint32_T, emxCreateND_uint32_Tтакже создать emxArray ценности. Тем не менее, они также выделяют кучу памяти для data поле emxArray, Эта память будет достаточно большой, чтобы вместить количество элементов, указанных в аргументах соответствующего размера. После их вызова вам нужно будет заполнить данные, хранящиеся в data поле возвращенного emxArray структура:

/* Allocate a 10-by-10 uint32 emxArray and fill the values */
int k = 0;
emxArray *pEmx = emxCreate_uint32_T(10, 10);
for (k = 0; k < 100; ++k) {
    pEmx->data[k] = (uint32_T) k;
}

/* Use pEmx here*/

/* Deallocate any memory allocated in pEmx. */
/* This DOES free pEmx->data */
emxDestroyArray_uint32_T(pEmx);

Последний, emxDestroyArray_uint32_T, будет использоваться для уничтожения массива и освобождения любой памяти, выделенной предыдущими методами.

Наконец, чтобы захватить ваш вывод, вы можете использовать emxCreate_struct_T или же emxCreateND_struct_T создать пустое emxArray из struct_T значения с правильным количеством измерений, передавая 0 для одного или нескольких размеров, где это необходимо. Сгенерированный код выделит достаточно памяти для хранения полученных данных в вашем выводе emxArray во время выполнения. Затем вы можете проверить size поле этого вывода emxArray чтобы посмотреть размеры размеров data поле и извлекать данные, как вы хотите.

Документация по использованию emxArray аргументы доступны здесь.

Вам нужно использовать emxArray_uint32_T и emxArray_struct_T. Все определенные в кодере MATLAB типы данных, которые используются в коде (и вам необходимо их использовать), определены в заголовочном файле YourLibName _types.h.

Другие вопросы по тегам