Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przekazywanie wskaźnika z klasy X do klasy Y

Ostatnio zmodyfikowano 2012-04-17 00:43
Autor Wiadomość
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:
C/C++
Text::Text( const char * ftext, int ftextLenth, float * ftextPosition )
    : text( ftext )
    , textLenth( ftextLenth )
    , textPosition( ftextPosition )
{
    textFont = loadFont( "font1.png", 0 ); // Zwraca wskaznik na klase Font, to dziala
    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 ] ); // Tworzy się wskaźnik na klase Object
            //textCharData[l] = new Object(0, textFont->fontDataIds, 0, 32.0, 32.0, 128.0, 128.0);
            //textCharData[l]->tex = 3;
            cout << "D" << textCharData[ l ]->tex << "D"; // to pole zawiera losową liczbę, zamiast 3
        }
    }
}

Funkcja loadFont która zwraca wskaźnik do klasy Font (działa):
C/C++
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):
C/C++
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"; // 1 obiekt tablicy zamiast zawierac 3 zawiera losowa liczbe
    tex = images[ type ];
    cout << endl << "G" << images[ 0 ] << "G"; // 1 obiekt tablicy zamiast zawierac 3 zawiera losowa liczbe
    cout << endl << "T" << tex << "T"; // pole tex zawiera losową liczbę zamiast 3
}
P-54564
DejaVu
» 2012-04-17 00:43:41
C/C++
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).
P-54687
« 1 »
  Strona 1 z 1