2013-02-10 61 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

相關問題