如何在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的答案中,但没有运气..
谢谢!
如果查看生成代码的目录,则应找到名为
的文件。 该文件声明了一些实用程序函数,这些函数使得构造和销毁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
值。 但是,它们还为emxArray
的data
字段堆积分配存储。 这个内存足够大,可以保存各自大小参数中指定的元素数。调用它们之后,您需要填充存储在返回的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_T
或emxCreateND_struct_T
通过在适当的位置传递0一个或多个大小来创建具有适当维数的struct_T
值的空emxArray
。 生成的代码将分配足够的内存, emxArray
在运行时将结果数据保存在输出emxArray
中。 然后,您可以检查此输出emxArray
的size
字段,以查看data
字段的尺寸大小,并根据需要提取数据。
有关使用emxArray
参数的文档,请参见此处 。
您需要使用emxArray_uint32_T和emxArray_struct_T 。 代码使用的所有MATLAB Coder定义的数据类型(您需要使用)都在YourLibName _types.h头文件中定义。