如果您使用过 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
价值。但是,它们也会data
为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
在运行时将结果数据保存在输出中。然后,您可以检查size
此输出的字段emxArray
以查看该字段的尺寸大小data
并根据需要提取数据。
此处提供了使用emxArray
参数的文档。