Speicherzugriffsfehler (Speicherabzug geschrieben)



  • 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.



  • @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Ohne läufts halt nicht

    Dann machst du Blödsinn.

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Naja hab C++ halt mit Internet tutorials gelernte.

    Ja, schlechte Idee.



  • Ich Kann hier einen Der Einstig In C++ hab halt Pointer und Header echt Schweirigkeiten. und um die übungen zu lösen müsst ich mir nochma das halbe Buch durchlesen auserdem benutzt es C++ 11 ISO also auch schon veraltet.



  • @luzl Du hast ein Buch über C++ bei dem Spielereien mit sfml zu den Grundlagen gehören? Wegwerfen. Gaaaanz weit.



  • @Swordfish sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    hast ein Buch über C++ bei dem Spielereien mit sfml zu den Grundlagen gehören? Wegwerfen. GAAAAANZ weit.

    Nein Die Grundlagen von C++ snytax Pointer Funktion Header hab ich mir nicht gegeben und templats etc
    Es heißt C++ Der Einstig aktuell zu c++ 11
    hatte es mir halb 3/4 mäßig durchgelesen mit dem kremmpel was ich hier gefunden hab unter Linux mit Python ähnelt sich ja doch,sowie die ganzen c Dokumente und funktioniert irgendwie,doch solang es klappt und ich jetzt nicht in einer Programmierer Gruppe lande wo alles zu 100% beim ersten versuch sein muss Laufen muss. geht's. z.b. Mit dem Pointer war ja jezt hier hatte das halt alles unter Linux geschriebn auch wenn die in anderen foren auch meinen es ginge ohne bei mir eben nicht und jezt läuft es immerhin. auch wenn ich ungern Pointer benutze.



  • @luzl Mein lieber. Das Beispiel das ich weiter oben gegeben habe läuft garantiert auf allem, das einen halbwegs aktuellen C++-Compiler hat (gcc, clang) und worauf SFML portiert wurde. Wenn das bei Dir nicht tut, machst Du was falsch. So einfach ist das. Nix Pointer. Nix new.

    @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    [...] unter Linux mit Python ähnelt sich ja doch, sowie die ganzen c Dokumente und funktioniert irgendwie, doch solang es klappt und ich jetzt nicht in einer Programmierer Gruppe lande wo alles zu 100% beim ersten versuch sein muss Laufen muss. geht's. [...]

    Von einer Sprache auf eine andere zu schließen ist eine gaaaanz doofe Idee. Besonders Python und C++!? Du machst Dir selbst das Leben schwer. Besorg' Dir ein Lehrbuch und arbeite es durch.



  • g++ --version
    g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
    Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
    Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    

    Verwnde schon nur c++ mit gcc geht es auch nicht In den Exampels von SFML exstiert auch das Pong spiel einfach als beispiel. dies lief auch nur bis zur gameloop(); D.h Anzeigen des Textes doch drückte ich start stürzte es ab ich weiß das ist auch keine optimale lösung nach einigen minuten/ sekunden stürzt das hier laufende spiel auch ab jedoch werde ich aus dem debugger ddd auch nicht schaluer hab halt noch null Plan wie ich damit umgehen soll



  • @luzl und der Code?


Anmelden zum Antworten