2

The C function (C static library) created by codegen takes an input argument of type const emxArray_uint32_T and return values of type emxArray_struct_T. As the type suggests, input is an array of uint32 and output is an array of struct.

I'm not sure how to use this function in my C program. For the input, should I declare an array of type uint32_T or use the type emxArray_uint32_T ? For the output, because I don't know the size of the output array, how to declare the array of struct to receive the return values from the function?

I put the question in MATLAB answers but have not luck..

Thanks!

4

2 回答 2

4

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

如果您查看生成代码的目录,您应该会找到一个名为<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从现有数据创建具有指定数量的维度和大小的 a。因此,如果您已经在某些内存中分配了输入数据,这些函数会将这些数据包装成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价值。但是,它们也会dataemxArray. 这个内存足够大,可以容纳在它们各自的大小参数中指定的元素数量。调用这些之后,您将需要填充存储在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_TemxArray值。struct_T生成的代码将分配足够的内存来emxArray在运行时将结果数据保存在输出中。然后,您可以检查size此输出的字段emxArray以查看该字段的尺寸大小data并根据需要提取数据。

此处提供了使用emxArray参数的文档。

于 2014-06-17T19:02:01.863 回答
1

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

于 2014-06-15T14:28:32.200 回答