SFML setPixel Fehlermeldung: "Zugriffsverletzung beim Schreiben" und "Unbehandelte Ausnahme"



  • Hallo,
    ich bin noch in C++ noch Neuling, doch arbeite bereits 2 Jahre damit.
    Ich habe nun mit Microsoft Visual Studio 2010 und SFML ein Programm geschrieben, welches mir erstmal den Graphen von einer linearen Funktion berechnet und in einem
    Fenster als Bild ausgibt.
    Der Quellcode wird auch soweit ohne Fehlermeldungen vom Compiler
    übersetzt doch, wenn ich denn Graphen "zeichnen" lassen möchte erscheint die Fehlermeldung: "Zugriffsverletzung beim Schreiben" und "Unbehandelte Ausnahme".
    Ich habe nun leider keine Ahnung wo ich anfangen soll um den Fehler zu finden und zu beheben.
    Vielen Dank für eure Hilfe 🙂

    #include <iostream>
    #include <windows.h>
    #include <SFML\Graphics.hpp>
    #include <SFML\Graphics\Image.hpp>
    sf::Image image;
    
    int creatImage(int x, int y)
    {
    	image.create(800, 800, sf::Color::White);
    	image.setPixel(x, y, sf::Color::Black);
    	return 0;
    }
    
    int drawGraph()
    {
    	sf::RenderWindow MainWindow(sf::VideoMode(800,800,32),"Ihr     Graph",sf::Style::Titlebar);
    	sf::Event MainEvent;
    	sf::Texture texture;
    	texture.loadFromImage(image);
    	sf::Sprite sprite(texture);
    	while(MainWindow.isOpen())
    	{
    		while(MainWindow.pollEvent(MainEvent))
    		{
    			if(sf::Keyboard::isKeyPressed(sf::Keyboard::F11)) MainWindow.close();
    		}
    
    		MainWindow.clear();	
    		MainWindow.draw(sprite);
    		MainWindow.display();
    	}
    	return 0;
    }
    
    int lineareFunktion(int m,int n)
    {
    	int y;
    	for(int i = -40; i<=40 ; i++)
    	{
    		y = m*i+n;
    		creatImage(i,y);
    	}
    	drawGraph();
    	return 0;
    }
    
    int main()
    {
    	int eingabe,n,m;
    	std::cout<<"Graphenzeichnen 0.01beta\nBitte weahle Typ der Funktion:\nlineare Funktion[1]\nweitere folgen...\n>>";
    	std::cin>>eingabe;
    	if(eingabe==1)
    	{
    		std::string ein;
    		system("cls");
    		std::cout<<"Eine lineare Funktion hat immer die Form: f(x)=mx+n.\nBitte geben sie im Folgenden die werte fuer m und n ein:\nm= ";
    		std::cin>>m;
    		std::cout<<"n= ";
    		std::cin>>n;
    		std::cout<<"Graph berechen? [J|N] \n>>";
    		std::cin>>ein;
    		if(ein=="J")
    		{
    			lineareFunktion(m,n);
    		}
    		if(ein=="N")
    		{
    			std::cout<<"TSCHUESS!";
    			Sleep(2000);
    			return 0;
    		}
    	}
    	return 0;
    }
    


  • Mögliche Ursache:

    SFML-Doku:

    void sf::Image::setPixel 	( 	unsigned int  	x,
    		unsigned int  	y,
    		const Color &  	color 
    	) 		
    
    Change the color of a pixel.
    
    This function doesn't check the validity of the pixel coordinates, using out-of-range values will result in an undefined behaviour.
    

    (Beachte den letzten Satz).

    gepaart mit:

    int creatImage(int x, int y)
    {
        image.create(800, 800, sf::Color::White);
        image.setPixel(x, y, sf::Color::Black);
        return 0;
    }
    ...
        for(int i = -40; i<=40 ; i++)
        {
            y = m*i+n;
            creatImage(i,y);
        }
    ...
    

    Überlege, welche "pixel coordinates" hier letztendlich an setPixel übergeben werden,
    besonders in Bezug auf int -> unsigned int und "doesn't check the validity ... undefined behaviour").

    Das muss nicht der einzige (oder gar tatsächliche) Grund für dein Problem sein,
    ist aber dennoch ein extrem wahrscheinlicher.

    Nebenbei solltest du auch überlegen, ob es Sinn macht, für jeden Pixel ein
    neues Bild zu erzeugen ( image.create ). Das sieht mir ein wenig danach
    aus, als wäre das nicht unbedingt, was du mit deinem Code erreichen willst.

    Finnegan


Log in to reply