2010-06-24 17 views
5

Chcę zaimplementować funkcję z OpenGL do renderowania cylindra w C++. Podpis mojej funkcji jest następująca:Odniesienie do tablicy dwuwymiarowej

#define POINTS_NUM 15 
#define DEMESION 3 

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

chcę użyć odniesienie do dwuwymiarowej tablicy w celu ograniczenia wprowadzania danych przez użytkownika, ale niektóre dziwne zachowanie się dzieje. Kiedy wdrożyć funkcję zadeklarowaną jak wyżej, wystąpi błąd Łącznik:

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

Tutaj vase jest zdefiniowany jako:

GLfloat vase[ POINTS_NUM ][ DEMESION ]; 

Na początku myślałem, że coś było nie tak z ostatniego wymiaru. Więc pominąłem to w mojej drugiej próbie. Ta deklaracja czas mojej funkcji jest tak:

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

Teraz błąd czasu kompilacji pojawia się, gdy wywołany jako (vase definicja nie ulega zmianie):

drawCylinder(10, 10, vase); 

Błąd kompilacji:

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

Z tego błędu wynika, że ​​parametr vertices jest traktowany jako odniesienie do dwuwymiarowej tablicy, ale dlaczego vase jest analizowany jako float (* vase)[3] w mojej pierwszej wersji?

My IDE to Visual Studio 2008. Nie próbowałem go z GCC; czy to zachowanie zależy od kompilatora?

Mam nadzieję, że ktoś może mi pomóc w pozbyciu się pułapki.

+0

możliwe duplikat [Jak przechodzą odniesienie do tablicy dwuwymiarowej do funkcji?] (Http://stackoverflow.com/questions/404232/how-do-i-pass-a- odwołanie do dwuwymiarowej tablicy do funkcji) –

Odpowiedz

2

Twoja pierwsza deklaracja jest w porządku. Wydaje się, że zdefiniowałeś vase w pliku nagłówkowym.

+0

Tak, masz rację. Po dokładnym sprawdzeniu mojego kodu stwierdzam, że wazon jest zdefiniowany tuż przed deklaracją funkcji. Ale dlaczego nie mogę zdefiniować tablicy w pliku nagłówkowym? Nie znałem żadnych ograniczeń w tym zakresie. Dzięki. –

+0

Twój nagłówek jest zawarty w kilku plikach cpp. Oznacza to, że "wazon" zostanie zdefiniowany kilka razy. Możesz zadeklarować go w nagłówku, a następnie zdefiniować go w jednym z plików cpp. –

+0

Tak, znam tę sprawę. Ale zdefiniowałem makro, aby uniknąć duplikowania. Wciąż jest problem. –

1

Wygląda na to, że problem polega tylko na tym, że vase jest zdefiniowany jako zdefiniowany jako w pliku nagłówkowym. Należy tylko zadeklarować zmiennych w plikach nagłówkowych.

Powoduje to problem, ponieważ wielokrotne definicje tworzą wiele tego samego symbolu, co powoduje dezorientację łącznika (stąd błąd łącznika). Kiedy łącznik próbuje dopasować odniesienia do zmiennej do rzeczywistej definicji, nie wie, którego użyć.

Osłony nagłowne nie chronią przed tym. Makra używane w ochronie nagłówka są zdefiniowane tylko jako na jednostkę tłumaczeniową. Za każdym razem, gdy kompilator zaczyna kompilować nowy plik .cpp (ignorując kompilacje jedności itp.), Jest to nowa jednostka tłumaczeniowa i zasadniczo kompilator zaczyna od zera, nie wiedząc o żadnych symbolach, które zostały wcześniej zdefiniowane.

Aby rozwiązać ten problem, tylko zadeklarować zmienne w plikach nagłówkowych:

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

a następnie określić tej zmiennej w jeden plik źródłowy.

int myGlobalVariable; 
Powiązane problemy