Fehlermeldung: : Zugriffsverletzung beim Schreiben an Position ...



  • Hallo Leute,
    ich habe versucht anhand einpaar YouTube Tutorials ein kleines "Programm" zu Programmieren und bin dabei immer wieder an diese Fehlermeldung gestoßen:

    Ausnahme ausgelöst bei 0x002D12DB in Project2.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x002D5001.
    Ausnahmefehler bei 0x002D12DB in Project2.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x002D5001

    Da ich ein blutiger Anfänger bin, habe ich keine Ahnung was es damit auf sich hat.

    Hier ist der Code:

    #include <iostream>
    
    struct Spielfeld
    {
    	bool istBesetzt;
    	char Name[10];
    
    };
    
    const int Breite = 5;
    const int Hoehe = 5;
    
    Spielfeld spielf[Breite][Hoehe];
    
    void showGame();
    void showField();
    void clear();
    void set();
    
    int main()
    {
    
    	int Wert = 0;
    	clear();
    
    	do
    	{
    
    		std::cout << std::endl;
    		std::cout << "1 - Clear" << std::endl;
    		std::cout << "2 - showGame" << std::endl;
    		std::cout << "3 - showField" << std::endl;
    		std::cout << "4 - set" << std::endl;
    		std::cin >> Wert;
    
    		switch (Wert)
    		{
    		case (1):
    		{
    			clear();
    		}break;
    		case (2):
    		{
    			showGame();
    		}break;
    		case (3):
    		{
    			showField();
    		}break;
    		case (4):
    		{
    			set();
    		}break;
    		default:
    		{
    			std::cout << "Falscher Wert!" << std::endl;
    		}
    		}
    
    	} 
    	while (Wert < 5 && Wert > 0);
    	return 0;
    }
    
    	void clear()
    	{
    		for (int x = 0; x < Breite; x++)
    		{
    			for (int y = 0; x < Hoehe; y++)
    			{
    				spielf[x][y].istBesetzt = false;
    
    			}
    		}
    	}
    
    	void showGame()
    	{
    		for (int x = 0; x < Breite; x++)
    		{
    			for (int y = 0; x < Hoehe; y++)
    			{
    				if ( spielf[x][y].istBesetzt == true )
    				{
    					std::cout << "b";
    				}
    				else
    				{
    					std::cout << "n";
    				}
    
    			}
    
    		}
    
    	}
    
    	void set()
    	{
    		int y, x;
    		std::cout << "Gebe X ein!" << std::endl;
    		std::cin >> x;
    		std::cout << "Gebe Y ein!" << std::endl;
    		std::cin >> y;
    
    		if (spielf[x][y].istBesetzt = true)
    		{
    			std::cout << "ist bereits besetzt!" << std::endl;
    		}
    		else
    		{
    			std::cout << "Gebe den Namen des Spielers ein!" << std::endl;
    			std::cin.get(spielf[x][y].Name, 9);
    			spielf[x][y].istBesetzt = true;
    		}
    
    	}
    
    	void showField()
    	{
    		int y, x;
    		std::cout << "Gebe X ein!" << std::endl;
    		std::cin >> x;
    		std::cout << "Gebe Y ein!" << std::endl;
    		std::cin >> y;
    
    		if (spielf[x][y].istBesetzt == true)
    		{
    			std::cout << "Name: " << spielf[x][y].Name << std::endl;
    		}
    		else
    		{
    			std::cout << "ist noch nicht besetzt!" << std::endl;
    		}
    
    	}
    

    Entschuldigung im Voraus falls der Code zu lang zum lesen ist. Visual Studio zeigt nicht in welcher Zeile sich der Fehler befindet.

    Ich bedanke mich für jeden Tipp.



  • Du greifst auf Speicher zu, der dem Programm nicht gehört.

    x.cpp: In function ‘void set()’:
    x.cpp:106:31: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
    if (spielf[x][y].istBesetzt = true)
    ~~~~~~~~~~~~~~~~~~~~^~

    Da willst du sicher ein ==. Schalte die Warnungen in deinem Compiler an.

    Benutze std::string, nicht char Arrays. Initialisiere deine Struktur:

    struct Spielfeld
    {
    	bool istBesetzt{false};
    	std::string Name;
    };
    


  • Der eigentlich Fehler sind die zwei Zeilen mit

    for (int y = 0; x < Hoehe; y++)
    

    Du willst nicht x überprüfen. Mit einem Debugger kann man diese Fehler leicht finden.

    Vermeiden lassen sich solche Fehler, wenn man erst gar keinen Index benutzt:

      #include <iterator>
      ...
    
       void clear()    
        {
                for (auto& row: spielf )
                {
                        for ( auto& field: row )
                        {
                                field.istBesetzt = false;
    
                        }
                }
        }
    

Log in to reply