【问题标题】:C++: Accessing data of dynamic structures within extern functionC++:在外部函数中访问动态结构的数据
【发布时间】:2014-11-07 20:08:50
【问题描述】:

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

程序使用 mex 将数据从 Matlab 传递到 C++。我使用 Visual Studio。

我在 'InOut.h' 的头文件中定义的结构

#include <string>
#include <cstdint>
#include <cstdlib>

struct sObjects {
    std::string Type;
    float *Position;
};
typedef struct sObject sObject;

在主函数中我比分配结构在'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' 未定义此运算符或 转换为预定义运算符可接受的类型"

为什么我可以在主函数中访问数据,而不能在辅助函数中访问数据?

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

非常感谢您的宝贵时间!

【问题讨论】:

  • 您只向我们展示了部分代码;一方面,你在哪里定义了Objectscreate_Objectscreate_OpticsObjects 也一样吗?请提供完整的信息,最好使用最少的工作代码。目前问题不是很清楚。
  • 抱歉,我混淆了将代码缩减到我认为可能至关重要的部分......我编辑了上面的原始帖子
  • 我找到了一个我不理解的可编译的工作解决方案。我会试着总结一下:我用指针创建了像sObjects *Objects = new sObjects[N_Obj]; 这样的结构......然后我在循环中分配了结构。如果我传递像create_Objects(sObjects *Objects, int N_Obj); 这样的对象,它会起作用。但如果我通过引用传递它就不会 &
  • 我不确定我是否理解这里的问题。请发布您实际使用的代码以及确切的错误消息...

标签: c++ matlab dynamic struct mex


【解决方案1】:

您似乎正在尝试将struct 直接用作typedef。只需将typedef 添加到您的struct 定义中,即可将其转换为类型。

像这样:

... #include "mex.h"

typedef struct sObjects {
    std::string Type;
    float *Position;
};

(否则你应该使用完整的struct 关键字,如@9​​87654328@。)

您的函数原型不需要extern 限定符。

你不需要extern,除非你想要全局变量。您似乎只需要全局 structs 或示例中的类型,因此不需要 extern

对全局变量使用 extern

您可能指的是对象的一个​​实例(或指向您的对象的指针),并且可以使用extern 使其成为全局对象。就像头文件的摘录一样:

... #include "mex.h"

typedef struct sObjects {
    std::string Type;
    float *Position;
};

extern sObjects *pointerToOnesObjects;

然后在 ONE 源文件中,您需要声明“真实”变量,如下所示(最好在此处对其进行初始化):

sObjects *pointerToOnesObjects = NULL;

使用此方法,您的变量 pointerToOnesObjects 现在可以全局使用(在使用相同头文件的所有源文件中)。

【讨论】:

  • 感谢您的帮助,
  • 希望对您有所帮助。请相应地标记“答案”:)。
  • 对不起,我太快了……我摆脱了外部,我用 typdef 'struct sObjects { ...}; 定义了结构。 typedef struct sObject sObject;'但是错误“错误C2676:二进制'[':'sObjects'没有定义此运算符”仍然存在......我也尝试将其直接传递为'void create_OpticsObjects(struct sObjects&Objects,int N_Obj);'
  • 一旦你使用了'typedef struct' AAAA,AAAA 可以单独使用,因为它现在是一个'类型'。您将不需要在 'void create_OpticsObjects(struct sObjects &Objects, int N_Obj);' 中使用 struct 关键字...
  • @Grantly:OP 正在使用 C++,在这种情况下,structtypedef 不是必需的(与 C 不同):stackoverflow.com/q/612328/97160
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2023-03-18
  • 2011-05-08
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多