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ę: 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 ) { 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: 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. |
|
pekfos |
» 2013-11-25 16:47:20 Podaj treść błędu. |
|
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...
|
|
pekfos |
» 2013-11-25 16:58:58 To nie błąd linkera. Poza tym, za mało kodu dałeś. |
|
oputyk Temat założony przez niniejszego użytkownika |
» 2013-11-25 17:16:34 Ok. To dalsza część kodu: 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 ) ); } }
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: 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. |
|
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. |
|
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: OB[ 0 ] = OB_Menu( Okno, language );
PS: ta linia jest niepoprawna: |
|
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 :) |
|
« 1 » |