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 的顶部执行这些分配时,我得到“'objmesh'没有命名类型”错误。

但是当我将所有这些分配放在 parser.cpp 中的一个函数中时(而 obj objmesh; 具有全局范围),我没有收到错误并且编译得很好。

谁能想到为什么会这样?我正在使用 Mingw Gnu 4.6 C++ 编译器

4

2 回答 2

4

为什么?因为当您单独进行分配时,您实际上是在为每个分配执行指令,在 C 中必须在函数中。

但是,您可以进行静态初始化(只要值是固定的)。静态初始化由编译器在编译时完成,因此不会执行任何指令来设置结构的值。

double verts[20][3];

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

如果您必须动态分配“顶点”,那么这对您不起作用。

于 2013-02-10T00:48:16.033 回答
3

您需要在函数中分配作业,例如:

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 ...

于 2013-02-10T00:33:04.880 回答