Speicherzugriffsfehler (Speicherabzug geschrieben)


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



  • #include <SFML/Graphics.hpp>
    #include<SFML/Window.hpp>
    #include<SFML/System.hpp>
    
    
    
    using namespace sf;
    using namespace std;
    
    
    
    int main()
    {
    
        //float move_x =1.0;
        float move_y =1.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);
    
            Clock AITimer;
            //const Time AlTimer =seconds(0.01);
    
            Clock clock;
        while (window.isOpen())
        {
    
            Event event;
            while (window.pollEvent(event))
            {
                float deltaTime = clock.restart().asSeconds();
    
    
                if (event.type == Event::Closed)
                     {
                        window.close();
                        break;
    
                     }
                     if (event.type==Event::KeyPressed)
                            {
                                switch(event.key.code)
                                {
                                    case Keyboard::Escape:
                                    {
                                    window.close();
                                    break;
                                    }
                                    case Keyboard::W:
                                    {
                                    bg->move(bg->getPosition().x,bg->getPosition().y+move_y*deltaTime);
                                    break;
                                    }
                                    case Keyboard::S:
                                    {
                                    bg->move(bg->getPosition().x,bg->getPosition().y-move_y*deltaTime);
                                    break;
                                    }
                                    case Keyboard::A:
                                    {
                                    bg->move(bg->getPosition().x-move_y*deltaTime,bg->getPosition().y);
                                    break;
                                    }
                                    case Keyboard::D:
                                    {
                                    bg->move(bg->getPosition().x+move_y*deltaTime,bg->getPosition().y);
                                    break;
                                    }
                                    default :break;
                                }
                            }
            }
    
            window.clear(Color::Black);
            window.draw(*bg);
            window.display();
        }
    
    
        return 1 ;
    }
     
    

    Hab ich jezt kurz so weiter geschrieben nur Bewegt sich das bild diagonal o.O



  • Lass bitte Pointer und new endlich stecken.

    #include <sfml/graphics.hpp>
    #include <sfml/window.hpp>
    #include <sfml/system.hpp>
    
    int main()
    {
    	auto move_x{ 1.f };
    	auto move_y{ 1.f };
    
    	auto Tux_pos_x{ 100.f };
    	auto Tux_pos_y{ 100.f };
    
    	sf::Texture Background;
    	if (!Background.loadFromFile("tux.png"))
    		return EXIT_FAILURE;
    	
    	sf::Sprite bg{ Background };
    	bg.setPosition(Tux_pos_x, Tux_pos_y);
    
    	sf::RenderWindow window{ sf::VideoMode{ 800, 600, 32 }, "SDFFSAF", sf::Style::Titlebar | sf::Style::Close };
    	window.setVerticalSyncEnabled(true);
    
    	while (window.isOpen()) {
    		sf::Event event;
    		while (window.pollEvent(event)) {
    			if (event.type == sf::Event::Closed) {
    				window.close();
    				break;
    			}
    
    			if (event.type == sf::Event::KeyPressed) {
    				switch (event.key.code) {
    				case sf::Keyboard::Escape:
    					window.close();
    					break;
    
    				case sf::Keyboard::W:
    					Tux_pos_y -= move_y;
    					break;
    
    				case sf::Keyboard::S:
    					Tux_pos_y += move_y;
    					break;
    
    				case sf::Keyboard::A:
    					Tux_pos_x -= move_x;
    					break;
    
    				case sf::Keyboard::D:
    					Tux_pos_x += move_x;
    					break;
    				}
    			}
    		}
    
    		bg.setPosition(Tux_pos_x, Tux_pos_y);
    
    		window.clear(sf::Color::Black);
    		window.draw(bg);
    		window.display();
    	}
    }
    

    Was du aber mit Clock wolltest ist mir nicht so ganz klar.



  • Wenn man nicht auffindbare Speicherzugriffsfehler unter Linux hat, sollte man sich die Anleitung von valgrind zu Gemüte führen und damit das Programm debuggen. Nur weil das Programm unter Windows scheinbar korrekt läuft, muss das nicht wirklich so sein.

    Und die ewig wiederkehrenden Grundsatzdiskussionen new/delete ja oder nein, sollen hier andere führen. Es gibt massenweise alte APIs, wo man das so noch benutzen muss, und die bleiben einem als Anfänger auch nicht erspart.



  • Ergänzend würde ich raten, einfach mal mit -fsanitize=address zu kompilieren. Das findet auch sehr schnell die Fehler. Siehe https://github.com/google/sanitizers/wiki/AddressSanitizer

    Ich würde valgrind nur als 2. Schritt nehmen, denn valgrind habe ich als laaaangsaaahhhhm in Erinnerung.



  • @john-0 sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Und die ewig wiederkehrenden Grundsatzdiskussionen new/delete ja oder nein, sollen hier andere führen.

    Der Ort, wo hier new/delete verwendet wurde, war wohl noch nie eine Grundsatzdiskussion, sondern immer falsch. Da kann man auch gerne darauf hinweisen.



  • @Jockelx sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Der Ort, wo hier new/delete verwendet wurde, war wohl noch nie eine Grundsatzdiskussion, sondern immer falsch. Da kann man auch gerne darauf hinweisen.

    Ich wollte nur darauf hinweisen, dass ich nicht gewillt bin darüber zu diskutieren. Denn ich sehe beim groben Überfliegen des Threads zwei wesentliche Dinge: Erstens trotz des inhaltlichen korrekten Hinweises scheint es irgend wie nicht anzukommen. Zweitens gab es bisher nicht wirklich einen Hinweis darauf wie man das Problem auch mit Zeigern löst. Vielleicht überdenkt man mal die Kommunikationsstrategie, wenn der Inhalt nicht ankommt?


Anmelden zum Antworten