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

[SFML 2.0] Program Mapa.exe przestał działać.

Ostatnio zmodyfikowano 2013-07-03 01:12
Autor Wiadomość
Alan468
Temat założony przez niniejszego użytkownika
[SFML 2.0] Program Mapa.exe przestał działać.
» 2013-07-02 22:00:11
Witam,
Chciałem zapytać czy nagłe zwolnienie sporej ilości różnej maści zmiennych może powodować wyskakiwanie takich błędów? Czy jednak będę musiał poszukać jakiegoś błędu w kodzie?
P-86846
akwes
» 2013-07-02 22:05:06
Nie. Ale źle przeprowadzone zwolnienie, czy zwolnienie usuniętych już raz elementów, tudzież używanie usuniętych może to spowodować.
P-86847
Alan468
Temat założony przez niniejszego użytkownika
» 2013-07-02 22:09:58
Błąd wyskakuje dopiero w momencie zamknięcia okna RenderWindow w oknie konsoli ... A czy ożycie destruktora w klasie i wywołanie itd mogła by pomóc.
P-86848
akwes
» 2013-07-02 22:13:10
Bez przykładu kodu to wróżenie z fusów. Coś jest źle zwalniane albo zwalniane dwa razy skoro tak się zachowuje aplikacja.
P-86849
Alan468
Temat założony przez niniejszego użytkownika
» 2013-07-02 22:19:53
Cały kod jest tu
main.cpp:
C/C++
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <sstream>
#include "zmienne.h"
#include "WczytywaniePliku.h"

using namespace std;
using namespace sf;

string IntToStr( int & a ) {
    Zmienne MZ;
    MZ.ITS << a;
    MZ.text = MZ.ITS.str();
    return MZ.text;
}

int main()
{
   
    Zmienne MZ;
    WczytajPlik( MZ );
   
   
    RenderWindow MapaGry( VideoMode( 1280, 720, 32 ), "Mapa Gry" /*, Style::Fullscreen*/ );
    while( MapaGry.isOpen() )
    {
        MZ.X_Myszy = MZ.Zdarzenie.mouseMove.x;
        MZ.Y_Myszy = MZ.Zdarzenie.mouseMove.y;
       
        while( MapaGry.pollEvent( MZ.Zdarzenie ) ) {
            if( Event::KeyPressed && MZ.Zdarzenie.key.code == Keyboard::Escape ) { MapaGry.close(); }
            if( MZ.Zdarzenie.type == Event::Resized ) { MapaGry.setSize( Vector2u( 1280, 720 ) ); }
            if( MZ.Zdarzenie.type == Event::Closed ) { MapaGry.close(); }
           
            MZ.Najechano_Na_Pole = 0;
            for( int y = 0; y <= 648; y = y + 72 ) { // Zaznaczenie pola//
                for( int x = 0; x <= 648; x = x + 72, MZ.Najechano_Na_Pole++ ) {
                    if(( MZ.X_Myszy > x && MZ.X_Myszy <=( x + 72 ) ) &&( MZ.Y_Myszy > y && MZ.Y_Myszy <=( y + 72 ) ) )
                    {
                        MZ.Zaznaczenie.setPosition( x, y );
                       
                        if( MZ.Zdarzenie.type == Event::MouseButtonPressed && MZ.Zdarzenie.mouseButton.button == Mouse::Left ) {
                           
                            MZ.Kliknieto_N_Pole = MZ.Najechano_Na_Pole;
                            MZ.NumerNap.setString( IntToStr( MZ.Kliknieto_N_Pole ) );
                           
                            MZ.CzyGraczaOdpNap.setString( MZ.Czy_Gracza[ MZ.Kliknieto_N_Pole ] );
                            MZ.CzyMAtakowacOdpNap.setString( MZ.Czy_M_Atakowac[ MZ.Kliknieto_N_Pole ] );
                            MZ.NazwaMisjiOdp.setString( MZ.Nazwa_Misji[ MZ.Kliknieto_N_Pole ] );
                            MZ.CzyWrogaOdpNap.setString( MZ.Czy_Wroga[ MZ.Kliknieto_N_Pole ] );
                        } } } }
        }
       
        MapaGry.clear();
       
        MapaGry.draw( MZ.TloMapy );
        MapaGry.draw( MZ.Zaznaczenie );
       
        MapaGry.draw( MZ.PoleNrNap ); MapaGry.draw( MZ.NumerNap );
        MapaGry.draw( MZ.CzyGraczaNap ); MapaGry.draw( MZ.CzyGraczaOdpNap );
        MapaGry.draw( MZ.CzyMAtakowacNap ); MapaGry.draw( MZ.CzyMAtakowacOdpNap );
        MapaGry.draw( MZ.NazwaMisji ); MapaGry.draw( MZ.NazwaMisjiOdp );
        MapaGry.draw( MZ.CzyWrogaOdpNap ); MapaGry.draw( MZ.CzyWrogaNap );
        MapaGry.display();
    }
    return 0;
}

WczytywaniePliku.h:
C/C++
#ifndef WczytywaniePliku_H
#define WczytywaniePliku_H
#include <string>
#include <iostream>
#include <fstream>
#include "zmienne.h"
using namespace std;

void WczytajPlik( Zmienne & MZ )
{
    fstream Plik_Z_Danymi;
    Plik_Z_Danymi.open( "data/properties.txt", ios::in );
    cout << "Wczytywanie danych..." << endl;
    if( Plik_Z_Danymi.good() == true )
    {
        std::cout << "Uzyskano dostep do pliku!" << std::endl;
        for( int Nr_Pola = 0; Nr_Pola <= 100; Nr_Pola++ )
        {
            Plik_Z_Danymi >> MZ.Nazwa_Pola[ Nr_Pola ] >> MZ.Czy_Gracza[ Nr_Pola ] >> MZ.Czy_Wroga[ Nr_Pola ] >> MZ.Czy_M_Atakowac[ Nr_Pola ] >> MZ.Nazwa_Misji[ Nr_Pola ];
            if( MZ.Nazwa_Pola[ Nr_Pola ] == "endfile" ) { cout << endl << "Przerwano " << endl; Plik_Z_Danymi.close(); break; }
        }
        cout << "Wczytano." << endl;
        Plik_Z_Danymi.close();
    }
}
#endif

zmienne.h:
C/C++
#ifndef ZMIENNE_H
#define ZMIENNE_H

#include <string>

using namespace std;
using namespace sf;

class Zmienne
{
public:
    Texture tlomapy;
    Texture zaznaczenie;
   
    ostringstream ITS; //Int To String
   
    Sprite TloMapy;
    Sprite Zaznaczenie;
   
    Text PoleNrNap, NumerNap;
    Text CzyGraczaNap, CzyGraczaOdpNap;
    Text CzyWrogaNap, CzyWrogaOdpNap;
    Text CzyMAtakowacNap, CzyMAtakowacOdpNap;
    Text NazwaMisji, NazwaMisjiOdp;
   
    std::string Nazwa_Pola[ 100 ];
    std::string Czy_Gracza[ 100 ];
    std::string Czy_Wroga[ 100 ];
    std::string Czy_M_Atakowac[ 100 ];
    std::string Nazwa_Misji[ 100 ];
    std::string text;
   
    int Najechano_Na_Pole;
    int Kliknieto_N_Pole;
    int Wys;
   
    int X_Myszy;
    int Y_Myszy;
   
    Event Zdarzenie;
    Font czcionka;
   
    Zmienne();
};

Zmienne::Zmienne()
{
   
    tlomapy.loadFromFile( "data/DCMI/mapa.bmp" ); TloMapy.setTexture( tlomapy );
    zaznaczenie.loadFromFile( "data/DCMI/zaznaczenie.bmp" ); Zaznaczenie.setTexture( zaznaczenie );
    czcionka.loadFromFile( "data/czcionka/arial.ttf" );
   
    PoleNrNap.setString( "Pole nr.: " ); PoleNrNap.setPosition( 750, 200 );
    CzyGraczaNap.setString( "Czy gracza: " ); CzyGraczaNap.setPosition( 750, 250 );
    CzyWrogaNap.setString( "Czy wroga: " ); CzyWrogaNap.setPosition( 750, 300 );
   
    CzyMAtakowacNap.setString( "Czy mozna zatakowac: " ); CzyMAtakowacNap.setPosition( 750, 350 );
    NazwaMisji.setString( "Nazwa misji: " ); NazwaMisji.setPosition( 750, 400 );
   
   
    NumerNap.setPosition( 860, 200 );
    CzyGraczaOdpNap.setPosition( 910, 250 );
    CzyWrogaOdpNap.setPosition( 910, 300 );
   
    CzyMAtakowacOdpNap.setPosition( 1060, 350 );
    NazwaMisjiOdp.setPosition( 920, 400 );
}


#endif



sądzę że w ten sposób będzie łatwiej
P-86850
akwes
» 2013-07-02 22:40:53
Wygląda na to, że jest problem ze zwalnianiem zasobów. Ogólnie, z tego co pamiętam, to nie wolno pozyskiwać zasobów sf::Font przed tworzeniem okna i zwalniać po jego zniszczeniu.

Spróbuj zamienić miejscami linijki:
C/C++
Zmienne MZ;
WczytajPlik( MZ );

RenderWindow MapaGry( VideoMode( 1280, 720, 32 ), "Mapa Gry" /*, Style::Fullscreen*/ );

na

C/C++
RenderWindow MapaGry( VideoMode( 1280, 720, 32 ), "Mapa Gry" /*, Style::Fullscreen*/ );

Zmienne MZ;
WczytajPlik( MZ );

przekompiluj, odpal i powiedz czy problem dalej występuje.
P-86854
MrPoxipol
» 2013-07-02 22:41:13
Spróbuj sprawdzić debuggerm, w którym miejscu następuje crash tzn. w której lini.
P-86855
Alan468
Temat założony przez niniejszego użytkownika
» 2013-07-02 22:51:28
Przeniosłem te linijki i nic ,a przy debugowaniu w rogu ekranu wyskoczyło mi
Program received signal SIGSEGV, Segmentation fault.
 plus jeszcze:
#0 02928D81 atioglxx!DrvGetProcAddress() (C:\Windows\SysWOW64\atioglxx.dll:??)
#1 02934C59 atioglxx!DrvGetProcAddress() (C:\Windows\SysWOW64\atioglxx.dll:??)
#2 0239C1A7 atioglxx!DrvGetProcAddress() (C:\Windows\SysWOW64\atioglxx.dll:??)
#3 6E185563 ~WglContext(this=0x5830f0) (D:\developpement\sfml-master\src\SFML\Window\Win32\WglContext.cpp:110)
#4 6E181A15 sf::priv::GlContext::globalCleanup() (D:\developpement\sfml-master\src\SFML\Window\GlContext.cpp:119)
#5 6E1823F5 ~GlResource(this=0x3940bf8) (D:\developpement\sfml-master\src\SFML\Window\GlResource.cpp:75)
#6 68EE2F14 ~Texture(this=0x3940bf8) (D:\developpement\sfml-master\src\SFML\Graphics\Texture.cpp:97)
#7 68F99BBF ~Page(this=0x3940be0) (D:/developpement/sfml-master/include/SFML/Graphics/Font.hpp:239)
#8 68FE39F4 ~pair(this=0x3940bd8) (d:/programmes/mingw-4.4-sjlj/bin/../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_pair.h:68)
#9 68F9A859 __gnu_cxx::new_allocator<std::pair<unsigned int const, sf::Font::Page> >::destroy(this=0x28fc93, __p=0x3940bd8) (d:/programmes/mingw-4.4-sjlj/bin/../lib/gcc/mingw32/4.4.1/include/c++/ext/new_allocator.h:115)
#10 68FE8688 std::_Rb_tree<unsigned int, std::pair<unsigned int const, sf::Font::Page>, std::_Select1st<std::pair<unsigned int const, sf::Font::Page> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, sf::Font::Page> > >::_M_destroy_node(this=0x6907f090, __p=0x3940bc8) (d:/programmes/mingw-4.4-sjlj/bin/../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:383)
#11 68FE9222 std::_Rb_tree<unsigned int, std::pair<unsigned int const, sf::Font::Page>, std::_Select1st<std::pair<unsigned int const, sf::Font::Page> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, sf::Font::Page> > >::_M_erase(this=0x6907f090, __x=0x3940bc8) (d:/programmes/mingw-4.4-sjlj/bin/../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:972)
#12 68FE8F61 std::_Rb_tree<unsigned int, std::pair<unsigned int const, sf::Font::Page>, std::_Select1st<std::pair<unsigned int const, sf::Font::Page> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, sf::Font::Page> > >::clear(this=0x6907f090) (d:/programmes/mingw-4.4-sjlj/bin/../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:726)
#13 68FE3615 std::map<unsigned int, sf::Font::Page, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, sf::Font::Page> > >::clear(this=0x6907f090) (d:/programmes/mingw-4.4-sjlj/bin/../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_map.h:626)
#14 68EC277E sf::Font::cleanup(this=0x6907f080) (D:\developpement\sfml-master\src\SFML\Graphics\Font.cpp:385)
#15 68EC1C8F ~Font(this=0x6907f080) (D:\developpement\sfml-master\src\SFML\Graphics\Font.cpp:95)
#16 68EC25BB __tcf_0() (D:\developpement\sfml-master\src\SFML\Graphics\Font.cpp:332)
#17 68EC1086 __dll_exit() (C:\Users\Alan\Desktop\aaaaaaaa\Projekt 1\Projekt\mapa gry\bin\Debug\sfml-graphics-d-2.dll:??)
#18 68EC1106 DllMainCRTStartup@12() (C:\Users\Alan\Desktop\aaaaaaaa\Projekt 1\Projekt\mapa gry\bin\Debug\sfml-graphics-d-2.dll:??)
#19 771E9950 ntdll!RtlpNtMakeTemporaryKey() (C:\Windows\system32\ntdll.dll:??)
#20 00000000 0x68ec0000 in ??() (??:??)
#21 00000000 0x00000000 in ??() (??:??)

i na koniec
Program received signal SIGSEGV, Segmentation fault.
In atioglxx!DrvGetProcAddress () (C:\Windows\SysWOW64\atioglxx.dll)
Debugger finished with status 0
P-86858
« 1 » 2 3
  Strona 1 z 3 Następna strona