Speicherzugriffsfehler (Speicherabzug geschrieben)



  • Hey Leute Hab da so ein kleines Problem und echt keine Ahnung wie ich es angehen soll.
    Der Titel sagt eigentlich schon alles. Das ist wie ich bis jetzt gehört habe ein Problem was öfters bei Ubuntu vorkommt. Würde mich echt freun wenn mir jemand sagt wie der zustande kommt, also im allgemeinen.

    #include <SFML/Graphics.hpp>
    #include<SFML/Window.hpp>
    #include<SFML/System.hpp>
    using namespace sf;
    using namespace std;
    Texture* Background;
    Sprite*bg;
    
    
    int main()
    {
    if (!Background->loadFromFile("rec/BG1.png"))
    
                return EXIT_FAILURE;
        bg->setTexture(*Background);
        bg->scale(200,200);
        bg->setPosition(0,0);
        bg->setColor(Color::White);
    
        RenderWindow* window = new RenderWindow  ;
        window->setSize(Vector2u(800,600));
        window->setTitle("SSSS");
    
    
            window->setVerticalSyncEnabled(1);
    
        while (window->isOpen())
        {
    
            Event event;
            while (window->pollEvent(event))
            {
                if( (event.type == Event::Closed) || event.key.code == Keyboard::Escape)
                    window->close();
            }
            window->draw(*bg);
            window->clear();
            window->display();
        }
    
    
        return 0;
    }
    

    Das sollte so ein kleines test fenster werden. Jedoch wenn ich die Sprite zeichne
    Stürzt das Programm ab und in der konsole steht dann

    Speicherzugriffsfehler (Speicherabzug geschrieben)
    

    Ich bedanke mich schonmal.



  • Das passiert nicht erst beim Zeichnen, sondern schon bei loadFromFile.

    int main()
    {
        Texture Background;
        if (!Background.loadFromFile("rec/BG1.png"))
                return EXIT_FAILURE;
        ....
       RenderWindow window;
       window.setSize(Vector2u(800,600));
       ...
    
    }
    

    Ich würds mal so probieren.



  • Also die Pointer sind nicht das Problem hab die auch nur gemacht um das eventuell zu lösen die Meldung bleibt die selbe
    Denoch danke für die schnelle antwort



  • @luzl
    Texture* Background;
    wird als globale Variable auf 0 gesetzt.

    Mit
    if (!Background->loadFromFile("rec/BG1.png"))
    derefernzierst du ihn -> Crash.

    Du kannst auch den Debugger drüber laufen lassen, dieser wird genau an dieser Stelle stehenbleiben. Mit dem Sprite hast du allerdings anschließend genau das gleiche Problem.

    Wenn, dann könntest du auch per new Speicher anfordern, ich würde es aber wenn nur mit einem smart-Poiner machen.
    Allerdings gibt es hier keinen Grund dafür, Zeiger zu verwenden.



  • Es könnte auch mit der Opngl version zusammenhägen warum auch immer
    Bei dem Pong exampel welches bis zur gameloop läuft also Sobalt ich space drücke Stürzt es ab.
    kommt beim Start :

    Warning: The created OpenGL context does not fully meet the settings that were requested
    Requested: version = 1.1 ; depth bits = 0 ; stencil bits = 0 ; AA level = 0 ; core = false ; debug = false ; sRGB = true
    Created: version = 3.0 ; depth bits = 0 ; stencil bits = 0 ; AA level = 0 ; core = false ; debug = false ; sRGB = false
    
    

    Nun weiß ich nur noch nicht ob ich Die Version 1.1 Update kann oder wo die Datei ist das ich sRGB =1 ; setzen kann
    mit
    if (!Background->loadFromFile("rec/BG1.png"))
    Geb ich ja nur den EXIT_FAILURE zurück wenn es nicht lädt


  • Mod

    Schon komisch, wieso Leute Fragen stellen, wenn sie keine Antworten haben möchten.



  • @SeppJ sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Schon komisch, wieso Leute Fragen stellen, wenn sie keine Antworten haben möchten.

    Also ich hätte ja schon gern ne Antwort. 😃
    Das Problem ist ja anscheinend ein Ubuntu Problem nur konnte ich nicht festellen was genau der Auslöser ist unter Windows läuft es ja ganz gut.
    Sonst hätte ich das ja hier nicht rein gestellt.
    Hatte das Problem auch schon als Code::Blocks abgestürzt ist.
    Also wird's vermutlich nicht am Code liegen.



  • @luzl

    Also wird's vermutlich nicht am Code liegen.

    Jaja



  • Ich weiß das ,dass Programm unter Windows Läuft also wird es nicht am Code liegen ich weiß ja nicht wo diese Settings datei Von OpGl ist oder wie ich das da updaten kann. Ich meine ist doch besser das gleich unter Linux zu machen da wenn der Code hier läuft vermutlich auch unter windows funzt. Sonst wäre es ja in Grafik und Spiele gelandet versuh es jezt mit SDL2 mal sehen obs klappt.



  • Mechaniker: "Dein Auto hat nen Motorschaden."
    Besitzer: "Kann nicht sein."
    Mechaniker: "Doch, da schau: Kolbenfresser!"
    Besitzer: "Kann nicht sein."
    Mechaniker: "Bist Du blind!?"
    Besitzer: "Aber es fährt doch!?"
    Mechaniker: "Ja, aber nur bergab!"
    Besitzer: "Das muss an der Straße liegen."
    Mechaniker: "Ja ne, ist klar."

    Merkst was?

    Du dereferenzierst in Deinem Code einen Nullpointer1). Das gibt undefined behaviour. Kann gehen, kann aber auch nicht gehen, kann Dir von miraus bei der Ausführung Deinen Rechner abfackeln oder Dir eine Pizza bestellen. Oder sonstwas.

    Mach mal

    if (!Background || !Background->loadFromFile("rec/BG1.png"))
        return EXIT_FAILURE;
    

    dann siehst Du wie toll das auf $DeinLieblingsOS läuft.

    [1] Oder worauf glaubst Du zeigt Background?



  • #include <SFML/Graphics.hpp>
    #include<SFML/Window.hpp>
    #include<SFML/System.hpp>
    #include<SFML/Graphics/RenderWindow.hpp>
    #include<SFML/Graphics/Texture.hpp>
    #include<iostream>
    using namespace sf;
    using namespace std;
    
    
    
    
    int main()
    {
        Sprite bg;
        Texture Background;
        Background.loadFromFile("tux.png");
    
        bg.setTexture(Background);
        bg.scale(200,200);
        bg.setPosition(0,0);
        bg.setColor(Color::White);
    
        RenderWindow window(VideoMode(600,800,32),"DDDD",Style::Titlebar|Style::Close);
        window.setVerticalSyncEnabled(1);
    
        while (window.isOpen())
        {
    
            Event event;
            while (window.pollEvent(event))
            {
                if( (event.type == Event::Closed) || event.key.code == Keyboard::Escape)
                    {
                    window.close();
                    break;
                    }
            }
            window.draw(bg);
            window.clear();
            window.display();
        }
    
    
        return 0;
    }
    

    wenn das bild nicht vorhanden ist läuft es

    g++ -c -Wall main.cpp
    
     g++ main.o -o app -lsfml-system -lsfml-window -lsfml-graphics 
    ./app
    
    Speicherzugriffsfehler (Speicherabzug geschrieben)
    


  • Gut es will garnicht 😃 @Swordfish
    immerhin Passiert jetz nix

    #include <SFML/Graphics.hpp>
    #include<SFML/Window.hpp>
    #include<SFML/System.hpp>
    using namespace sf;
    using namespace std;
    Texture* Background;
    Sprite*bg;
    
    
    int main()
    {
    if (!Background|| !Background->loadFromFile("rec/BG1.png"))
    
                return EXIT_FAILURE;
        bg->setTexture(*Background);
        bg->scale(200,200);
        bg->setPosition(0,0);
        bg->setColor(Color::White);
    
        RenderWindow window(VideoMode(300,300,32),"SDFFSAF",Style::Titlebar|Style::Close);
    
    
            window.setVerticalSyncEnabled(1);
    
        while (window.isOpen())
        {
    
            Event event;
            while (window.pollEvent(event))
            {
                if( (event.type == Event::Closed) || event.key.code == Keyboard::Escape)
                    window.close();
            }
            window.draw(*bg);
            window.clear();
            window.display();
        }
    
    
        return 0;
    }
    

  • Gesperrt

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    immerhin Passiert jetz nix

    Mach mal in der ersten Zeile der Main:

    Background = new Texture();
    bg = new Sprite();
    


  • Danke l Das hat jezt echt geklappt 😃
    muss ich das fenster nurnoch offen halten
    und mir das mit den Pointern ansehen dann wird es wohl auch klappen
    Danke auf jedenfall 😃


  • Gesperrt

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    und mir das mit den Pointern ansehen dann wird es wohl auch klappen

    Pointer brauchst du doch eigentlich nicht. Sprite und Texture einfach als lokale Variablen in der Main anlegen. Dann entfällt auch das 'deleten'.



  • @RBS2 Eigentlich hatte halt das Problem mit dem speicher zugriff
    dann dacht ich Pointer.
    hat ja jezt geklappt nur die sprite wird nicht angezeigt.



  • @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    hat ja jezt geklappt nur die sprite wird nicht angezeigt.

    Wird es, aber Du machst danach sf::RenderTarget::clear() ...

    #include <cstdlib>
    
    #include <sfml/graphics.hpp>
    #include <sfml/window.hpp>
    
    int main()
    {
    	sf::Texture image;
    	if (!image.loadFromFile("rec/BG1.png"))
    		return EXIT_FAILURE;
    
    	sf::Sprite sprite{ image };
    	sf::RenderWindow window{ sf::VideoMode{ 300, 300, 32 }, "SDFFSAF", sf::Style::Titlebar | sf::Style::Close };
    
    	while (window.isOpen()) {
    		sf::Event event;
    		while (window.pollEvent(event)) {
    			if (event.type == sf::Event::Closed || event.key.code == sf::Keyboard::Escape)
    				window.close();
    		}
    
    		window.draw(sprite);
    		window.display();
    	}
    }
    

    tut toll.



  • Ja hab das jetzt so gelöst läuft ganz gut würde ich sagen

    #include <SFML/Graphics.hpp>
    #include<SFML/Window.hpp>
    #include<SFML/System.hpp>
    
    
    
    using namespace sf;
    using namespace std;
    
    
    
    int main()
    {   int changeX =0;
    int changY =0;
        int Tux_pos_x =100;
        int Tux_pos_y =100;
        Texture* Background ;
        Sprite*bg;
        Background = new Texture();
        bg = new Sprite();
    
    
        if(!Background->loadFromFile("tux.png",IntRect(0,1,0,1)))
    	return EXIT_FAILURE;
        bg->setTexture(*Background);
        bg->scale(1,1);
        bg->setPosition(Tux_pos_x,Tux_pos_y);
    
    
    
        RenderWindow window(VideoMode(800,600,32),"SDFFSAF",Style::Titlebar|Style::Close);
    
    
            window.setVerticalSyncEnabled(1);
    
        while (window.isOpen())
        {
    
            Event event;
            while (window.pollEvent(event))
            {
                if( (event.type == Event::Closed) || event.key.code == Keyboard::Escape)
                     window.close();
    
                     switch(event.key.code)
                        {
                            case Keyboard::D:
                                Tux_pos_x+20;
                                window.clear();
                                window.draw(*bg);
                                window.display();
                        }
            }
    
    	window.clear(Color::Black);
            window.draw(*bg);
    
            window.display();
        }
    
    
        return 1 ;
    }
    
    

    Naja mal sehen wie das noch wird unter Windows brauchte ich keine Pointer verwenden
    und mit Debuggern kann ich auch nicht umgehen.



  • Kannst Du bitte Pointer und new bleiben lassen? Bist Du Java-vorgeschädigt!?

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    und mit Debuggern kann ich auch nicht umgehen.

    lernen?

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    unter Windows brauchte ich keine Pointer verwenden

    Du brauchst auch unter Linux keine Pointer.

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    return 1 ;
    

    Kreativ. Ein Programm sollte 0 oder EXIT_SUCCESS oder für C und C++ garnichts zurückgeben wenn kein Fehler aufgetreten ist.

    [basic.start.main/5]:

    [...] If control flows off the end of the compound-statement of main, the effect is equivalent to a return with operand 0 (see also [except.handle]).



  • Dieser Beitrag wurde gelöscht!


  • @Swordfish sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    ointer und new bleiben lassen? Bist Du Java-vorgeschädigt!

    Ohne läufts halt nicht und wollte mir jetzt kein Windows auf den Rechner installieren bin schon am überlegen das einfach nochmal in einer Vm laufen zu lassen müsst ich halt auch Download

    Naja hab C++ halt mit Internet tutorials gelernte. Java hatt ich auch mal hat mir absolut nicht gepasst auch wenn's leichter gemacht ist.Genauso wie C# soooooo viele libarys und ist eh fas das gleiche.


Anmelden zum Antworten