codegen创建的C函数(C静态库)采用类型为 const emxArray_uint32_T 的输入参数,并返回类型为 emxArray_struct_T 的值。如类型所示,input是一个uint32数组,output是一个struct数组。
我不确定如何在我的C程序中使用此功能。对于输入,我应该声明类型 uint32_T 的数组还是使用类型 emxArray_uint32_T ?对于输出,因为我不知道输出数组的大小,如何声明struct数组从函数接收返回值?
我把问题放在MATLAB的答案中,但没有运气..
谢谢!
答案 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_T
或emxCreate_struct_T
通过传递0来创建具有适当维数的空emxCreateND_struct_T
个emxArray
值适当的一种或多种尺寸。生成的代码将分配足够的内存,以便在运行时将结果数据保存在输出struct_T
中。然后,您可以查看此输出emxArray
的{{1}}字段,以查看size
字段尺寸的大小,并根据需要提取数据。
使用emxArray
参数的文档可用here。
答案 1 :(得分:1)
您需要使用 emxArray_uint32_T 和 emxArray_struct_T 。所有MATLAB Coder定义的代码使用(并且您需要使用)的数据类型都在 YourLibName _types.h头文件中定义。