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

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

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

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

Благодаря!

Если вы посмотрите в каталог, где вы сгенерировали код, вы должны найти файл с именем _emxAPI.h . Этот файл объявляет некоторые функции утилиты, которые emxArray построение и уничтожение значений 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 эти данные в 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 . Тем не менее, они также кучи выделяют хранилище для поля данных emxArray . Эта память будет достаточно большой, чтобы удерживать количество элементов, указанных в их соответствующих аргументах размера. После вызова этих данных вам нужно будет заполнить данные, хранящиеся в поле данных возвращаемой структуры 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 чтобы создать пустой struct_T значений struct_T с соответствующим количеством измерений, передав 0 для одного или нескольких размеров, где это необходимо. Сгенерированный код будет выделять достаточно памяти для хранения результирующих данных в вашем выводе emxArray во время выполнения. Затем вы можете проверить поле size этого выходного emxArray чтобы просмотреть размеры размеров поля data и извлечь данные по emxArray усмотрению.

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

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

Interesting Posts

Как получить счет с использованием графического API

Как правильно использовать Google Plus для входа в систему с несколькими действиями?

Какое хорошее решение для файловой маркировки в Linux?

Как получить индекс элемента в IEnumerable?

Приложения Metro в Windows 8.1 сбой при запуске

OS X: Можно ли поместить обычный текст по умолчанию?

Компиляция Visual Studio 2010 с версией отладки или выпуска сторонней библиотеки в зависимости от того, скомпилирован ли мой проект Build или Release?

Есть ли в XPath инструкция if if-else?

Импортировать уценку в Onenote

Использование SymDony2 AccessDeniedHandlerInterface

Не удается запустить mongodb by launchctl на OS X Yosemite (10.10.2)

В чем разница между @RequestBody и @RequestParam?

С двумя мониторами можно ли иметь 1 экран в режиме рабочего стола и один экран, показывающий экран запуска?

Глобальное управление памятью на C ++ в стеке или куче?

Отображение Unicode в Chrome против Firefox

Давайте будем гением компьютера.