2010-06-24 21 views
5

Desidero implementare una funzione con OpenGL per eseguire il rendering di un cilindro in C++. La firma della mia funzione è la seguente:Riferimento a una matrice bidimensionale

#define POINTS_NUM 15 
#define DEMESION 3 

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

voglio usare un riferimento a una matrice bidimensionale per limitare l'input dell'utente, ma qualche strano comportamento sta accadendo. Quando ho implementare la funzione dichiarata come sopra, un errore si verifica linker:

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

Qui vase è definito come:

GLfloat vase[ POINTS_NUM ][ DEMESION ]; 

In un primo momento, ho pensato che ci fosse qualcosa di sbagliato con l'ultima dimensione. Quindi l'ho omesso nel mio secondo processo. Questa dichiarazione momento della mia funzione è simile a questo:

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

Ora un errore di compilazione si verifica quando viene richiamato come (vase definizione non viene modificato): errore di

drawCylinder(10, 10, vase); 

Compile:

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

Da questo errore, posso vedere che il parametro vertices è veramente un riferimento a un array bidimensionale, ma perché vase viene analizzato come float (* vase)[3] nella mia prima versione?

Il mio IDE è Visual Studio 2008. Non l'ho provato con GCC; questo comportamento dipende dal compilatore?

Spero che qualcuno possa darmi una mano per liberarmi della trappola.

+0

possibile duplicato di [Come faccio a passare un riferimento a un array bidimensionale a una funzione?] (Http://stackoverflow.com/questions/404232/how-do-i-pass-a- riferimento-a-un-bidimensionale-matrice-a-una-funzione) –

risposta

2

La prima dichiarazione va bene. Sembra che tu abbia definito vase in un file di intestazione.

+0

Sì, hai ragione. Dopo aver controllato attentamente il mio codice, trovo che il vaso è definito appena prima della dichiarazione della funzione. Ma perché non riesco a definire la matrice nel file di intestazione? Non conoscevo alcun limite al riguardo. Grazie. –

+0

L'intestazione è inclusa in diversi file cpp. Ciò significa che 'vase' sarà definito più volte. Puoi dichiararlo in un'intestazione e poi definirlo in uno dei file cpp. –

+0

Sì, conosco questo caso. Ma, ho definito una macro per evitare duplicati inclusi. C'è ancora il problema. –

1

Sembra che il problema sia che è definito in un file di intestazione. Devi solo dichiarare le variabili nei file di intestazione.

Ciò causa un problema poiché le definizioni multiple producono più dello stesso simbolo, che confonde il linker (da cui l'errore del linker). Quando il linker tenta di associare i riferimenti alla variabile alla definizione effettiva, non sa quale utilizzare.

Le protezioni della testata non proteggono da questo. Le macro utilizzate in una protezione dell'intestazione sono definite solo per unità di traduzione. Ogni volta che il compilatore inizia a compilare un nuovo file .cpp (ignorando le build di unità, ecc.), Questa è una nuova unità di traduzione ed essenzialmente il compilatore inizia da zero, non conoscendo alcun simbolo che sia stato precedentemente definito.

Per risolvere questo problema, solo dichiarare le variabili nei file di intestazione:

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

e poi definiscono che file sorgente variabile in uno.

int myGlobalVariable; 
Problemi correlati