C ++:访问extern函数中的动态结构数据

时间:2014-11-07 20:08:50

标签: c++ matlab dynamic struct mex

我遇到了将动态分配的结构传递给函数并访问其内容的问题。

该程序使用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函数中的数据而不是辅助函数?

如果在编译时未知其大小,我如何在其他函数中访问动态分配的结构?

非常感谢你的时间!

1 个答案:

答案 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现在可以全局使用(在所有使用相同头文件的源文件中)。