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

[C++] This may be due to a corruption of the heap, which indicates a bug in Gra - Motor.exe or any of the DLLs it has loaded.

Ostatnio zmodyfikowano 2013-11-25 18:50
Autor Wiadomość
oputyk
Temat założony przez niniejszego użytkownika
[C++] This may be due to a corruption of the heap, which indicates a bug in Gra - Motor.exe or any of the DLLs it has loaded.
» 2013-11-25 16:20:23
No nie wiem jak to nazwać bez słowa problem, w tym przypadku.
W każdym bądź razie oto kod:
Linker pokazuje na zaznaczoną poniżej linijkę:
C/C++
bool OB_Menu::draw( pl::Obiekt * Obiekt )
{
    while( okno->pollEvent( zd ) )
    {
        if( sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) )
        {
            okno->close();
        }
        for( int i = 5; i < 11; i++ )
        {
            if( player[ i ].kolizja_kwadratowa_myszki(( sf::Vector2f ) sf::Mouse::getPosition() ) )
            {
                if( zd.type == zd.MouseButtonPressed && zd.mouseButton.button == sf::Mouse::Left )
                {
                    Obiekt = new OB_Menu( okno, language );
                    return true;
                }
            }
        }
    }
    for( int i = 5; i < 11; i++ )
    {
        if( player[ i ].kolizja_kwadratowa_myszki(( sf::Vector2f ) sf::Mouse::getPosition() ) )
        {
            player[ i ].setOnChoose( true );
        }
        else if( player[ i ].getOnChoose() )
        {
            player[ i ].setOnChoose( false );
        }
    }
    if( time.rest( czy, 10000000000000000000 ) >= number )
    {
        if( cz )
             cz = false;
        else
             cz = true;
       
        number += 200;
    }
    for( int i = 0; i < ile_plr; i++ )
    {
        player[ i ].update();
    }
    okno->draw( player[ 0 ].sprite );
    if( cz ) //////////////////////////////////////TUTAJ
    {
        okno->draw( player[ 2 ].sprite );
    }
    else
    {
        okno->draw( player[ 3 ].sprite );
    }
    okno->draw( player[ 4 ].sprite );
    okno->draw( title );
    for( int i = 5; i < 11; i++ )
    {
        okno->draw( player[ i ].sprite );
    }
    for( int i = 0; i < 6; i++ )
    {
        okno->draw( text[ i ] );
    }
    return false;
}
Oto inne części programu:
C/C++
class OB_Menu
    : public pl::Obiekt
{
protected:
    pl::Timer time;
    Language * language;
    bool cz, czy;
    int number;
    sf::Text title;
    sf::Text * text;
    sf::Event zd;
    pl::Font font;
public:
    OB_Menu( sf::RenderWindow * Okno, Language * Lan )
    {
        font = pl::Font( "times.ttf" );
        language = Lan;
        number = 0;
        cz = true;
        czy = true;
        okno = Okno;
        player = new pl::Player[ 11 ];
        sf::Text tex( language->OB_Menu_title, font.font, 85 );
        ile_plr = 11;
        ile_tex = 6;
        tex.setColor( sf::Color::White );
        title = tex;
        player[ 0 ] = pl::Player( "OB_Menu_tlo2.png" );
        player[ 1 ] = pl::Player( "OB_Menu_tlo1.png" );
        player[ 2 ] = pl::Player( "OB_Menu_title1.png", true );
        player[ 3 ] = pl::Player( "OB_Menu_title2.png", true );
        player[ 4 ] = pl::Player( "OB_Menu_title_mask.png", true );
        for( int i = 5; i < 11; i++ )
        {
            player[ i ] = pl::Player( "OB_Menu_Menu.png", true );
        }
        text = new sf::Text[ 6 ];
        for( int i = 0; i < 6; i++ )
        {
            text[ i ] = sf::Text( "", font.font, 30 );
            text[ i ].setColor( sf::Color::Blue );
        }
        text[ 0 ].setString( language->OB_Menu_graj );
        text[ 1 ].setString( language->OB_Menu_opcje );
        text[ 2 ].setString( language->OB_Menu_instrukcja );
        text[ 3 ].setString( language->OB_Menu_wyniki );
        text[ 4 ].setString( language->OB_Menu_autorzy );
        text[ 5 ].setString( language->OB_Menu_wyjscie );
        player[ 2 ].position =( sf::Vector2f(( 1366 - player[ 2 ].size.x ) / 2, 20 ) );
        player[ 3 ].position =( sf::Vector2f(( 1366 - player[ 2 ].size.x ) / 2, 20 ) );
        player[ 4 ].position = player[ 3 ].position;
        player[ 4 ].setOnChoose( true );
        player[ 4 ].text_center( title );
        player[ 5 ].position = sf::Vector2f(( 1366 - player[ 5 ].size.x ) / 2, player[ 3 ].position.y + player[ 3 ].size.y + 40 );
        sf::Color fs;
        for( int i = 5; i < 11; i++ )
        {
            if( i != 5 )
                 player[ i ].position = sf::Vector2f( player[ i - 1 ].position.x, player[ i - 1 ].position.y + player[ i - 1 ].size.y + 25 );
           
            player[ i ].text_center( text[ i - 5 ] );
            fs = player[ i ].color;
            fs.g = 150;
            player[ i ].colchoose = fs;
        }
        text[ 2 ].move( 0, - 2 );
    }
    OB_Menu()
    { }
    ~OB_Menu()
    {
        delete[] text;
        delete language;
        delete[] player;
    }
    bool draw( Obiekt * );
};
Linker pokazuje na zmienną bool, która nie została utworzona za pomocą operatora new... Więc o co w tym chodzi? Może błąd tkwi w jakiejś jeszcze innej części programu...
Z góry dzięki.
P-97431
pekfos
» 2013-11-25 16:47:20
Podaj treść błędu.
P-97434
oputyk
Temat założony przez niniejszego użytkownika
» 2013-11-25 16:53:59

This may be due to a corruption of the heap, which indicates a bug in Gra - Motor.exe or any of the DLLs it has loaded.

To jest treść błędu linkera, a on pokazuje na co chce, jak usunę instrukcję if.
Może to jakiś błąd wewnętrzny...
P-97437
pekfos
» 2013-11-25 16:58:58
To nie błąd linkera. Poza tym, za mało kodu dałeś.
P-97438
oputyk
Temat założony przez niniejszego użytkownika
» 2013-11-25 17:16:34
Ok. To dalsza część kodu:
C/C++
void Gra::present()
{
    pl::Timer tm;
    bool a = true;
    sf::Color col = first.getColor();
    sf::Color c = second.getColor();
    c.a = 0;
    col.a = 0;
    bool s = true;
    sf::Event zd;
    okno->clear();
    while( tm.rest( a, 13000 ) != 13000 && s )
    {
        while( okno->pollEvent( zd ) )
        {
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) )
            {
                s = false;
            }
        }
        if( tm.rest( a, 14000 ) < 3000 )
        {
            col.a =( tm.rest( a, 3000 ) * 255 / 3000 );
        }
        if( tm.rest( a, 14000 ) < 9000 && tm.rest( a, 14000 ) > 6000 )
        {
            c.a =(( tm.rest( a, 9000 ) - 6000 ) * 255 / 3000 );
        }
        if( tm.rest( a, 14000 ) < 6500 && tm.rest( a, 14000 ) > 3500 )
        {
            col.a = 255 -(( tm.rest( a, 6500 ) - 3500 ) * 255 / 3000 );
        }
        if( tm.rest( a, 14000 ) < 13000 && tm.rest( a, 14000 ) > 10000 )
        {
            c.a = 255 -(( tm.rest( a, 13000 ) - 10000 ) * 255 / 3000 );
        }
        second.setColor( c );
        first.setColor( col );
        okno->draw( second );
        okno->draw( first );
        okno->display();
        okno->clear();
    }
}
void Gra::gra()
{
   
    present();
    sf::Event zd;
    okno->clear();
    OB[ 1 ] = OB[ 0 ];
    while( okno->isOpen() )
    {
        OB[ 0 ].draw( & OB[ 0 ] );
        okno->display();
        okno->clear();
        sf::sleep( sf::milliseconds( 10 ) );
    }
}


C/C++
class Gra
{
protected:
    sf::RenderWindow * okno;
    pl::Obiekt * OB;
    Language * language;
    sf::Text first;
    sf::Text second;
    sf::Font font;
    void present();
public:
    Gra( sf::RenderWindow * Okno )
        : okno( Okno )
    {
        font.loadFromFile( "times.ttf" );
        first.setFont( font );
        second.setFont( font );
        language = new English;
        OB = new OB_Menu[ 2 ];
        OB[ 0 ] = OB_Menu( Okno, language );
        first.setStyle( first.Italic );
        second.setStyle( second.Italic );
        first.setString( language->present_first );
        second.setString( language->present_second );
        first.setCharacterSize( 200 );
        second.setCharacterSize( 125 );
        first.setColor( sf::Color::Red );
        second.setColor( sf::Color::Green );
        first.setPosition(( 1366 - first.getGlobalBounds().width ) / 2,( 768 / 2 ) - first.getGlobalBounds().height );
        second.setPosition(( 1366 - second.getGlobalBounds().width ) / 2,( 768 / 2 ) - second.getGlobalBounds().height );
    }
    ~Gra()
    {
        delete OB;
        delete language;
    }
    void gra();
};
 No i to chyba wszystko co może zawinić, no bo chyba w tym błędu, nie będzie:
C/C++
int main()
{
    sf::RenderWindow okno( sf::VideoMode( 1366, 768 ), "Gierka", sf::Style::Fullscreen );
    okno.setFramerateLimit( 60 );
    Gra gra( & okno );
    gra.gra();
}
Mogę jeszcze pokazać klasy pomocnicze, ale chyba to nie będzie konieczne.
P-97439
oputyk
Temat założony przez niniejszego użytkownika
» 2013-11-25 18:33:36
Mogę jeszcze dodać, że gdy usunę wszystko z funkcji, wszystko pięknie działa. A jeśli chodzi o błąd, który wyskakuje, to czasami jest to wcześniej wymieniony, a czasami o tym, że nastąpiła próba czytania z miejsca w pamięci, które nie istnieje.
Z góry dzięki za pomoc.
P-97445
pekfos
» 2013-11-25 18:47:06
Nie masz poprawnego operatora przypisania w OB_Menu, więc ten zapis powoduje późniejsze wysypanie się programu:
C/C++
OB[ 0 ] = OB_Menu( Okno, language );

PS: ta linia jest niepoprawna:
C/C++
delete OB;
P-97449
oputyk
Temat założony przez niniejszego użytkownika
» 2013-11-25 18:50:00
Ale głupi błąd, a ja siedziałem nad tym tyle czasu... Dobra dzięki :)
P-97451
« 1 »
  Strona 1 z 1