2010-06-24 19 views
5

Ich möchte eine Funktion mit OpenGL implementieren, um einen Zylinder in C++ zu rendern. Die Unterschrift meiner Funktion ist wie folgt:Verweis auf ein zweidimensionales Array

#define POINTS_NUM 15 
#define DEMESION 3 

void drawCylinder(int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][ DEMESION ]); 

ich einen Verweis auf eine zweidimensionale Matrix verwenden möchten Benutzereingabe zu begrenzen, aber einige seltsame Verhalten geschieht. Wenn ich die Funktion wie oben erklärt implementieren, tritt ein Linker-Fehler:

Error 1 error LNK2005: "float (* vase)[3]" ([email protected]@3PAY02MA) already defined in shapes.obj vase.obj VaseAndAnimation

Hier vase definiert ist als:

GLfloat vase[ POINTS_NUM ][ DEMESION ]; 

Zuerst dachte ich, es ist etwas falsch mit der letzten Dimension war. Also habe ich es in meinem zweiten Versuch weggelassen. Diesmal Erklärung meiner Funktion ist wie folgt:

void drawCylinder(int slices, int segments, GLfloat (&vertices)[ POINTS_NUM ][]); 

Nun wird ein Fehler bei der Kompilierung tritt auf, wenn aufgerufen, wie (vase Definition nicht geändert wird):

drawCylinder(10, 10, vase); 

Compile Fehler:

Error 1 error C2087: 'vertices' : missing subscript d:\visual studio 2008\projects\project1\computer graphics\vaseandanimation\shapes.h 25 VaseAndAnimation

Error 2 error C2664: 'drawCylinder' : cannot convert parameter 3 from 'GLfloat [14][3]' to 'GLfloat (&)[14][1]' d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\vase.cpp 64 VaseAndAnimation

Error 3 error C2087: 'vertices' : missing subscript d:\visual studio 2008\projects\project1\computer graphics\vaseandanimation\shapes.h 25 VaseAndAnimation

Error 4 error C2087: 'vertices' : missing subscript d:\Visual Studio 2008\Projects\Project1\Computer Graphics\VaseAndAnimation\shapes.cpp 12 VaseAndAnimation

Von diesem Fehler kann ich sehen, dass Parameter vertices wirklich eine Referenz auf ein zweidimensionales Array behandelt wird, aber warum vase als 012 geparst wirdin meiner ersten Version?

Meine IDE ist Visual Studio 2008. Ich habe es nicht mit GCC versucht; ist das Verhalten compilerabhängig?

Hoffe jemand kann mir eine Hand geben, um die Falle loszuwerden.

+0

möglich Duplikat [Wie gebe ich einen Verweis auf ein zweidimensionales Array an eine Funktion?] (Http://stackoverflow.com/questions/404232/how-do-i-pass-a- Referenz zu einem zweidimensionalen Array-to-a-Funktion) –

Antwort

2

Ihre erste Erklärung ist in Ordnung. Scheint, Sie haben vase in einer Header-Datei definiert.

+0

Ja, Sie haben Recht. Nachdem ich meinen Code sorgfältig überprüft habe, finde ich, dass die Vase kurz vor der Funktionsdeklaration definiert ist. Aber warum kann ich das Array nicht in der Header-Datei definieren? Ich kannte keine Grenzen. Vielen Dank. –

+0

Ihre Kopfzeile ist in mehreren cpp-Dateien enthalten. Dies bedeutet, dass "Vase" mehrmals definiert wird. Sie können es in einer Kopfzeile deklarieren und dann in einer der cpp-Dateien definieren. –

+0

Ja, ich kenne diesen Fall. Aber ich habe ein Makro definiert, um zu vermeiden, dass Duplikate enthalten sind. Es gibt immer noch das Problem. –

1

Es sieht aus wie das Problem ist nur, dass vase wird in einer Header-Datei definiert. Sie sollten nur Variablen in Header-Dateien deklarieren.

Dies verursacht ein Problem, weil die mehreren Definitionen mehrere des gleichen Symbols erzeugen, die den Linker (daher der Linker-Fehler) verwirrt. Wenn der Linker versucht, Verweise auf die Variable der tatsächlichen Definition zuzuordnen, weiß es nicht, welche zu verwenden ist.

Kopfschutz schützt nicht vor diesem. Die in einem Kopfschutz verwendeten Makros sind nur pro Übersetzungseinheit definiert. Jedes Mal, wenn der Compiler mit dem Kompilieren einer neuen CPP-Datei beginnt (Ignorieren von Unity-Builds usw.), ist dies eine neue Übersetzungseinheit, und der Compiler startet im Grunde von vorne und weiß nichts über zuvor definierte Symbole.

// extern specifies that the definition is elsewhere. 
extern int myGlobalVariable; 

und dann definieren diese Variable in eine Quelldatei:

Um dies zu beheben, nur Ihre Variablen in Header-Dateien deklarieren.

int myGlobalVariable; 
Verwandte Themen