2013-02-10 34 views
0

我有一个这样的结构在 “parser.h”结构分配给全局名称类型的错误

struct obj{ 
     char *filename; 
     unsigned long nverts; 
     unsigned long curvert; 
     double (*verts)[3]; 
     unsigned int *faces[3]; 
}; 

typedef obj obj; 

和parser.cpp

我声明

obj objmesh; 

    objmesh.filename="c://temp//wings.obj"; 
    objmesh.nverts = 20; 
    objmesh.verts = (double (*)[3]) malloc(objmesh.nverts * sizeof(double[3])); 
    objmesh.curvert = 0; 

当我在parser.cpp的顶部做这些assigments我得到“'objmesh'没有命名一个类型”的错误。

但是,当我把所有这些分配在一个函数中parser.cpp(而obj objmesh;具有全局范围),我没有错误,并编译好。

任何人都可以想到为什么会出现这种情况的原因吗?我使用MinGW的GNU 4.6 C++编译器

+0

你是说分配不在函数中吗? – 2013-02-10 00:31:19

+0

垫子,当作业是全球性的,我得到一个错误。当任务在一个函数中,但声明仍然是全局的,我没有错误。 – 2013-02-10 00:32:58

+0

你正在编写C或C++吗?因为C++的答案(使用构造函数)不会工作在C – MSalters 2013-02-10 00:41:50

回答

3

你需要一个函数内部分配,e.g:

obj objmesh; 

... 

int main(int argc, char **argv) 
{ 
... possibly other stuff here... 
    objmesh.filename="c://temp//wings.obj"; 
    objmesh.nverts = 20; 
    objmesh.verts = (double (*)[3]) malloc(objmesh.nverts * sizeof(double[3])); 
    objmesh.curvert = 0; 
... More code here ... 
} 

顺便说一句: double (*)[3])乞求一个typedef ...

+0

嗯,我明白了。我没有主要功能。这些将是功能文件的一部分。顺便说一句,这是我能够编译并为struct成员分配内存的唯一方法。如果你愿意,还有更好的方法吗? – 2013-02-10 00:36:02

+0

那么,你需要把它放在一些功能。我选择main是因为它是第一个被首先执行的东西。如何使用'typedef double vect3 [3]; ' 然后使用'vect3 * verts;'和'verts =(vect3 *)mallloc(...)' – 2013-02-10 00:39:24

+0

+1给字符“*”赋一个字符串文字也不完全给我热情。啊。 – WhozCraig 2013-02-10 00:52:03

4

为什么?因为当你单独进行赋值时,你实际上是在为每个赋值执行指令,而C中的赋值必须在函数中。

但是,你可以做静态初始化(只要值是固定的)。静态初始化由编译器在编译时完成,所以不执行指令来设置结构的值。

double verts[20][3]; 

obj objmesh = { 
    "c://temp//wings.obj", 
    20, 
    verts, /* declared above, not dynamically allocated */ 
    0 
    }; 

如果您必须动态分配'verts',那么这对您不起作用。

+0

这显然是另一种解决方案。 – 2013-02-10 00:52:48

+0

PQuinn感谢您提供第二种解决方案。因此,让我只选择一种解决方案,所以我不得不采用第一种解决方案。再次感谢 – 2013-02-10 02:02:14