Speicherzugriffsfehler (Speicherabzug geschrieben)



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



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

    Ich wollte nur darauf hinweisen, dass ich nicht gewillt bin darüber zu diskutieren.

    Weißt, wenn man zu etwas nichts sagen will, dann sagt man einfach nichts dazu.

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

    Es gibt massenweise alte APIs, wo man das so noch benutzen muss, [...]

    Ja, die Library zeigst mir bitte, die mich zwingt in C++ auch nur ein new zu schreiben.

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

    Zweitens gab es bisher nicht wirklich einen Hinweis darauf wie man das Problem auch mit Zeigern löst.

    wozu?



  • @wob sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Was du aber mit Clock wolltest ist mir nicht so ganz klar.
    Wie gesagt ich versuch mit den exapels von SFML die dabei sind das zu lernen.
    wird halt Clock verwendet. zwar erst nach if (Run) doch was solls

    Weiter kann ich sagen das es bei mir nur mit Pointier läuft.
    und zu guter lezt ist mir aufgefallen das meine CPU wenn das bild Steht bis an einem kern auf 100% auslastung steigt kann ja uch nicht normal sein



  • @luzl sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Weiter kann ich sagen das es bei mir nur mit Pointier läuft.

    Was meinst du? was läuft (worauf) und was nicht?



  • @Swordfish sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Weißt, wenn man zu etwas nichts sagen will, dann sagt man einfach nichts dazu.

    Irrtum, ich will etwas zur Kommunikationsstrategie sagen, weil diese kläglichst gescheitert ist. Aber das hält Dich nicht davon ab, sie weiter zu verfolgen.

    Ja, die Library zeigst mir bitte, die mich zwingt in C++ auch nur ein new zu schreiben.

    Gtkmm ist etwa so ein Library, weil sie noch einen eigenen RefPointer nutzt und da muss man alles erstmal mit new reinwerfen. Dann hatten wir letztlich das Problem, dass man mit „modernen“ C++ nicht in der Lage ist auf NUMA-Systemen schnellen Code zu schreiben. Allokatoren die NUMA korrekt unterstützen, erzeugen mit Standardcontainer UB. Dazu gibt es viele ältere Libraries, die nicht auf den neusten Stand von C++ sind, aber wegen ihrer fachspezifischen Lösungen weiter genutzt werden müssen. …

    wozu?

    Sonderlich erfolgreich ist Deine Art zu kommunizieren nicht. Ein weiter so, wird wohl kaum größeren Erfolg versprechen sondern höchstens den Nutzer vergraulen.

    P.S. valgrind haut dem Nutzer radikal alle Zeigerfehler um die Ohren. Da sieht man erst richtig, was für einen Schrottcode man prüft.



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

    Gtkmm ist etwa so ein Library

    In Qt (leider) auch. Wobei ich das jetzt auch halb so dramatisch finde. Qt kümmert sich zumindest halbwegs richtig um die Speicherverwaltung.



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

    Gtkmm

    @Mechanics sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Qt

    Das sind beides Dingstis, die ihre eigenen Smartpointer haben. Das ist nicht worauf ich hinauswollte.



  • @Mechanics sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    In Qt (leider) auch. Wobei ich das jetzt auch halb so dramatisch finde. Qt kümmert sich zumindest halbwegs richtig um die Speicherverwaltung.

    Das macht Gtkmm i.d.R. auch, und wenn man den GtkBuilder nutzt, kümmert sich Gtkmm um faktisch alles. Aber die meisten Tutorials basieren nicht auf Glade + GtkBuilder sondern auf GUI per Hand.

    @Swordfish sagte in Speicherzugriffsfehler (Speicherabzug geschrieben):

    Das sind beides Dingstis, die ihre eigenen Smartpointer haben. Das ist nicht worauf ich hinauswollte.

    Wie ich an anderer Stelle schon aufzeigte, kann man bestimmte Dinge nicht mit SmartPointer lösen. NUMA, das neue OpenMP 5.0, … zeigen, dass man in C++ noch immer LowLevel Speicheranforderungen durchführen muss, und dazu auch keine angepassten C++ Allokatoren nutzen kann. Die haben bei NUMA UB, wenn man sie zusammen mit den Container aus der Standard Library nutzt. Ja, das Problem wäre von Seiten des ISO-Kommittes lösbar.

    P.S. Seit OpenMP 4.0 ist es möglich C++ mit OpenMP zu nutzen, um Programme für GPUs zu schreiben. Mit OpenMP 5.0 ist die Laufzeitbibliothek speziell für die Speicherverwaltung deutlich erweitert worden, aber die API ist reines C. Dadurch können die Speicheranforderungen optimiert werden.



  • Dieser Beitrag wurde gelöscht!


  • Dieser Beitrag wurde gelöscht!


  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten