如何在C程序中使用MATLAB Coder codegen创建的C库和emxArray参数?

时间:2014-06-15 11:13:25

标签: c matlab types matlab-coder codegen

codegen创建的C函数(C静态库)采用类型为 const emxArray_uint32_T 的输入参数,并返回类型为 emxArray_struct_T 的值。如类型所示,input是一个uint32数组,output是一个struct数组。

我不确定如何在我的C程序中使用此功能。对于输入,我应该声明类型 uint32_T 的数组还是使用类型 emxArray_uint32_T ?对于输出,因为我不知道输出数组的大小,如何声明struct数组从函数接收返回值?

我把问题放在MATLAB的答案中,但没有运气..

谢谢!

2 个答案:

答案 0 :(得分:4)

如果您使用过C ++,emxArray数据类型就像std::vector生成的C等价物。也就是说,这就是生成的代码如何表示动态分配的数组。它们存储数据和大小指针以及一些其他细节。

如果查看生成代码的目录,则应找到名为<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的{​​{1}}字段堆积分配存储空间。这个内存足够大,可以保存各自大小参数中指定的元素数量。调用它们之后,您需要填充存储在返回的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_TemxCreate_struct_T通过传递0来创建具有适当维数的空emxCreateND_struct_TemxArray值适当的一种或多种尺寸。生成的代码将分配足够的内存,以便在运行时将结果数据保存在输出struct_T中。然后,您可以查看此输出emxArray的{​​{1}}字段,以查看size字段尺寸的大小,并根据需要提取数据。

使用emxArray参数的文档可用here

答案 1 :(得分:1)

您需要使用 emxArray_uint32_T emxArray_struct_T 。所有MATLAB Coder定义的代码使用(并且您需要使用)的数据类型都在 YourLibName _types.h头文件中定义。