如何使用MATLAB由codeR codeGEN在C程序与emxArray参数创建C库? [英] How to use C library created by MATLAB Coder codegen in C program with emxArray arguments?

查看:820
本文介绍了如何使用MATLAB由codeR codeGEN在C程序与emxArray参数创建C库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由codeGEN创建的C函数(C静态库)采用类型的输入参数的常量emxArray_uint32_T ,并返回类型的值 emxArray_struct_T 。作为类型所暗示的,输入是UINT32和输出的阵列是结构的阵列

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.

我不知道如何在我的C程序中使用此功能。对于输入,我要声明数组类型的 uint32_t的或使用类型的 emxArray_uint32_T ?对于输出,因为我不知道输出数组的大小,如何声明结构数组从函数接收返回值?

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?

我把在MATLAB回答了这个问题,但没有运气..

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

谢谢!

推荐答案

如果您在您生成code,你应该找到一个名为&LT文件的目录中查找; functionName> _emxAPI.h 。该文件宣称这使得建设和摧毁一些实用功能 emxArray 值简单。用它们来创建 emxArray 值确保所有字段都正确初始化和对 emxArray 键入

If you look in the directory where you generated code you should find a file named <functionName>_emxAPI.h. This file declares some utility functions which make constructing and destroying emxArray values simpler. Using them to create emxArray values ensures that all of the fields are properly initialized and insulates your code from any possible changes to the emxArray type.

在我做出了榜样这需要 UINT32 值的数组,并返回这样一个数组,我看到了以下功能:

In an example I made which takes an array of uint32 values and also returns such an array, I see the following functions:

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 指定大小的不为您的数据分配额外的内存。

The first pair, i.e. emxCreateWrapper_uint32_T, emxCreateWrapperND_uint32_T, can be used to create a uint32 emxArray with the specified number of dimensions and sizes from existing data. So if you already have the input data allocated in some memory, these functions wrap that data up into an emxArray of the specified size without allocating extra memory for your data.

/* 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 字段分配存储空间。该内存将大到足以容纳在各自的尺寸参数所指定的元素数调用这些后,您将需要填充存储在数据字段返回的数据 emxArray 结构:

The second pair, i.e. emxCreate_uint32_T, emxCreateND_uint32_T, also create emxArray values. However, they also heap allocate storage for the data field of the emxArray. This memory will be large enough to hold the number of elements specified in their respective size arguments After calling these, you will need to populate the data stored in the data field of the returned emxArray struct:

/* 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 ,将被用来摧毁阵列和释放由previous方法分配的内存。

The last, emxDestroyArray_uint32_T, will be used to destroy the array and deallocate any memory allocated by the previous methods.

最后,捕捉到你的输出,你可以使用 emxCreate_struct_T emxCreateND_struct_T 来创建一个空的 emxArray struct_T ,尺寸适当数量的值>。生成的code将分配足够的内存在输出 emxArray 在运行时保持得到的数据。然后,您可以检查此输出 emxArray 尺寸现场查看<$ C $的尺寸大小C>数据字段,并根据需要提取数据。

Finally, to capture your output, you could use emxCreate_struct_T or emxCreateND_struct_T to create an empty emxArray of struct_T values with the proper number of dimensions by passing 0 for one or more sizes where appropriate. The generated code will allocate enough memory to hold the resulting data in your output emxArray at runtime. You can then check the size field of this output emxArray to view the sizes of the dimensions of the data field and extract the data as you wish.

有关使用文档 emxArray 参数可<一个href=\"http://www.mathworks.com/help/fixedpoint/ug/c-$c$c-interface-for-unbounded-arrays-and-structure-fields.html#bsp2zlh\"相对=nofollow>这里。

这篇关于如何使用MATLAB由codeR codeGEN在C程序与emxArray参数创建C库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆