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

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

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

我把问题放在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中,而无需为数据分配额外的内存。

 /* 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值。 但是,它们还为emxArraydata字段堆积分配存储。 这个内存足够大,可以保存各自大小参数中指定的元素数。调用它们之后,您需要填充存储在返回的emxArray结构的data字段中的data

 /* 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_TemxCreateND_struct_T通过在适当的位置传递0一个或多个大小来创建具有适当维数的struct_T值的空emxArray 。 生成的代码将分配足够的内存, emxArray在运行时将结果数据保存在输出emxArray中。 然后,您可以检查此输出emxArraysize字段,以查看data字段的尺寸大小,并根据需要提取数据。

有关使用emxArray参数的文档,请参见此处 。

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