Как использовать библиотеку 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
, может быть использован для создания uint32
emxArray
с указанным количеством размеров и размеров из существующих данных. Так что, если у вас уже есть входные данные, выделенные в некоторой памяти, эти функции упаковывают эти данные в 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.