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.6C++コンパイラを使用しています

4

2 に答える 2

4

なんで?割り当てを個別に行う場合、基本的に各割り当ての命令を実行しているため、Cでは関数内にある必要があります。

ただし、静的初期化を行うことはできます(値が固定されている限り)。静的初期化はコンパイル時にコンパイラーによって実行されるため、構造体の値を設定するための命令は実行されません。

double verts[20][3];

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

'verts'を動的に割り当てる必要がある場合、これは機能しません。

于 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 に答える