Przekazywanie wskaźnika z klasy X do klasy Y
Ostatnio zmodyfikowano 2012-04-17 00:43
masterKoper Temat założony przez niniejszego użytkownika |
Przekazywanie wskaźnika z klasy X do klasy Y » 2012-04-15 19:24:48 Witam mam problem z przekazywaniem wskaźnika do tablicy. Sytuacja wygląda tak:
Wywołując konstruktor klasy Text, tworzę klasę Font ze wskaźnikiem textFont.
Później tworzy się tablica wskaźników typu Object i wywołuje się konstruktor klasy Object, w którym przekazuje wskaźnik do tablicy fontDataIds z klasy Font(która zawiera id tekstur które potem są wyświetlane). Tutaj mam problem, bo ze wszystkimi polami stworzonej klasy Object jest ok, tylko właśnie pole tex zamiast zawierać wartość 3(która wynikła z wcześniejszego załadowania tekstury) zawiera np. liczbę 2161567 nie wiadomo skąd, albo inną podobną liczbę. Chcę żeby pole tex klasy Object zawieralo dokladnie numer tekstury z przekazanej tablicy fontDataIds, a nie jakies inne liczby. Cały kod kilka kronie sprawdziłem i nie zauważyłem błędów :(( Proszę o pomoc.
Jeżeli coś jeszcze wkleić to napiszcie.
W kodzie jest lepiej wytłumaczone o co chodzi
Konstruktor klasy Text:
Text::Text( const char * ftext, int ftextLenth, float * ftextPosition ) : text( ftext ) , textLenth( ftextLenth ) , textPosition( ftextPosition ) { textFont = loadFont( "font1.png", 0 ); delay = 8; if( textLenth ) { textCharData = new Object *[ textLenth ]; for( int l = 0; l < textLenth; l++ ) { textCharData[ l ] = new Object( 0, textFont->fontDataIds, 0, textPosition[ 0 ] +( delay * l + textFont->charSize[ 0 ] * l ), textPosition[ 1 ], 6 *( float ) textFont->charSize[ 0 ], 6 *( float ) textFont->charSize[ 1 ], textFont->charTexPos[ 0 ] ); cout << "D" << textCharData[ l ]->tex << "D"; } } }
Funkcja loadFont która zwraca wskaźnik do klasy Font (działa):
Font * loadFont( const char * fontFileName, const char * configFileName ) { PNGimg * fontImage; GLuint fontImageIds[ 1 ]; fontImage = loadPNG( fontFileName ); fontImageIds[ 0 ] = fontImage->initTex(); delete fontImage; fontImage = 0; float *** tcharTexPos = new float **[ 256 ]; int tfontCharsNumber = 1; int * tcharSize = new int[ 2 ]; tcharSize[ 0 ] = 9; tcharSize[ 1 ] = 15; for( int n = 0; n < tfontCharsNumber; n++ ) { tcharTexPos[ n ] = new float *[ 4 ]; for( int m = 0; m < 4; m++ ) { tcharTexPos[ n ][ m ] = new float[ 2 ]; } tcharTexPos[ n ][ 0 ][ 0 ] = 32.0 / 128.0; tcharTexPos[ n ][ 0 ][ 1 ] = 1.0 -( 16.0 / 128.0 +( float ) tcharSize[ 1 ] / 128.0 ); tcharTexPos[ n ][ 1 ][ 0 ] = 32.0 / 128.0; tcharTexPos[ n ][ 1 ][ 1 ] = 1.0 -( 16.0 / 128.0 ); tcharTexPos[ n ][ 2 ][ 0 ] = 32.0 / 128.0 +( float ) tcharSize[ 0 ] / 128.0; tcharTexPos[ n ][ 2 ][ 1 ] = 1.0 - 16.0 / 128.0; tcharTexPos[ n ][ 3 ][ 0 ] = 32.0 / 128.0 +( float ) tcharSize[ 0 ] / 128.0; tcharTexPos[ n ][ 3 ][ 1 ] = 1.0 -( 16.0 / 128.0 +( float ) tcharSize[ 1 ] / 128.0 ); } return new Font( fontImageIds, tcharTexPos, tcharSize ); }
Konstruktor klasy Object (coś w nim jest nie tak):
Object::Object( int ftype, GLuint * fimages, bool fcollidable, float fposx, float fposy, float fsizex, float fsizey, float ** ftexturePos ) : posx( fposx ) , posy( fposy ) , sizex( fsizex ) , sizey( fsizey ) , images( fimages ) , collidable( fcollidable ) , texturePos( ftexturePos ) , type( ftype ) { cout << endl << "H" << images[ 0 ] << "H"; tex = images[ type ]; cout << endl << "G" << images[ 0 ] << "G"; cout << endl << "T" << tex << "T"; } |
|
DejaVu |
» 2012-04-17 00:43:41 fontImage = loadPNG( fontFileName ); fontImageIds[ 0 ] = fontImage->initTex();
delete fontImage;
Hm? Przemyśl ten kod. Tak w ogóle to lepiej poczytaj o kontenerach STL bo widać, że ich nie znasz - kod byłby krótszy, prostszy, lepszy, czytelniejszy i mniej podatny na błędy. Druga sprawa: źle organizujesz kod. Twoja klasa wymaga podania wielu argumentów do konstruktora, które są de-facto wskaźnikami i mogą przestać istnieć (bo inny obiekt go zniszczy). |
|
« 1 » |