我遇到了将动态分配的结构传递给函数并访问其内容的问题。
该程序使用mex将数据从Matlab传递到C ++。我使用Visual Studio。
我在'InOut.h'中的标题中定义的结构
#include <string>
#include <cstdint>
#include <cstdlib>
struct sObjects {
std::string Type;
float *Position;
};
typedef struct sObject sObject;
在main函数中我分配的结构是'MainFcn_Mex.cpp'
#include "MainFcn_Mex.h"
// ...
// get number of Objects from Matlab
int N_Obj = mxGetNumberOfElements(prhs[1]);
sObjects *Objects = new sObjects[N_Obj];
for (int k=0; k<N_Obj; k++) {
// get the pointer pointer map
pMap = mxGetField(prhs[1],k,"Type");
Objects[k].Type = mxArrayToString(pMap);
// get the pointer pointer map
pMap = mxGetField(prhs[1],k,"Position");
// setting pointer to the first Element
Objects[k].Position = (float*)mxGetPr(pMap);
mexPrintf("Objects(%d,1).Type: %s \n", k+1, Objects[k].Type);
}
create_Objects(Objects, N_Obj);
函数create_Objects位于不同的文件'create_Objects.cpp'中,并通过'MainFcn_Mex.h'包含:
#include <stdio.h>
#include <direct.h>
#define _USE_MATH_DEFINES
#include "math.h"
#include <cmath>
#include "mex.h"
#include "matrix.h"
#include <cuda.h>
#include <cuda_runtime.h>
#include "device_launch_parameters.h"
#include "InOut.h"
void create_Objects(sObjects *Objects, int N_Obj);
到目前为止,'create_Objects.cpp'的内容是:
#define _USE_MATH_DEFINES
#include "math.h"
#include <cmath>
#include "InOut.h"
#include "mex.h"
void create_Objects(sObjects *Objects, int N_Obj)
{
for (int k=0; k<N_Obj; k++) {
mexPrintf("Objects(%d,1).Type: %s \n", k+1, Objects[k].Type);
}
}
Visual Studio告诉我:
“错误C2676:二进制'[':'sObjects'没有定义此运算符或 转换为预定义运算符“
可接受的类型
为什么我可以访问main函数中的数据而不是辅助函数?
如果在编译时未知其大小,我如何在其他函数中访问动态分配的结构?
非常感谢你的时间!
答案 0 :(得分:0)
您似乎正在尝试将struct
直接用作typedef
。只需将typedef
添加到您的struct
定义中,即可将其转换为类型。
像这样:
... #include "mex.h"
typedef struct sObjects {
std::string Type;
float *Position;
};
(否则,您应该使用struct
中的完整void create_OpticsObjects(struct sObjects &Objects, int N_Obj)
关键字。)
您的功能原型不需要extern
限定符。
除非你想要全局变量,否则你不需要extern
。您似乎只想在示例中使用全局struct
或类型,因此不需要extern
。
对全局变量使用extern
您可能指的是对象的实例(或指向对象的指针),并且可以使用extern
使其成为全局对象。如在头文件的摘录中那样:
... #include "mex.h"
typedef struct sObjects {
std::string Type;
float *Position;
};
extern sObjects *pointerToOnesObjects;
然后在一个源文件中,您需要声明真实的&#39;变量如(在这里初始化它是好的):
sObjects *pointerToOnesObjects = NULL;
使用此方法,您的变量pointerToOnesObjects
现在可以全局使用(在所有使用相同头文件的源文件中)。