Speicherzugriffsfehler (Speicherabzug geschrieben)



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



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

Anmelden zum Antworten