C++ Fehler im Programm.. Weiß nicht warum :(

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hi,

Ich sitze jetzt schon sehr lange an einer Aufgabe meines C++ Buches...

Ich habe einen Fehler den ich einfach nicht weg bekomme..

Aufgabe des Programmes ist es eine Karte "5x5 Felder groß" zu malen. Mit einem Menübefehl soll man bestimten Feldern Koordinaten und Namen zuweißen können. Das Programm soll dann an den Koordinaten, wo eine Zuweißung statt gefunden hat ein "X "zeichnen und bei den andern ein "-".

Das mit den Koordinaten bekomme ich hin jedoch funktoniert das Zuweißen eines Namens für das Feld nicht.. die Eingabefunktion des charArrays sorgt dafür, dass das Menü immer und immer wieder neu geschrieben wird..

Hier ist irgendwo der Wurm drinne: (Ohne das Rot makierte funktoniert es jedoch perfekt)
Code:
				cout << "Gebe X-Wert ein: ";
				cin >> xEingabe;
				cout << "Gebe Y-Wert ein: ";
				cin >> yEingabe;
				cout << "Gebe einen Namen für das Feld ein: ";
				
				for(int g = 0; g<25; g++ )
				{
					if ( Felder[g].Yposi == yEingabe )
					{
						if (Felder[g].Xposi == xEingabe )
						{
							Felder[g].bFeldstatus = true;	
							cout << "Feld" << g << "mit den Koordinaten " << Felder[g].Xposi << " und " << Felder[g].Yposi <<	" wurde true" << endl;				
[COLOR="Red"]							cout << "Gebe einen Namen für das Feld ein: ";
							cin.get (Felder[g].chFeldName, 10);
							cin.ignore;
[/COLOR]

Und hier nochmal der ganze Code:
Code:
#include <iostream>

using namespace std;

//Funktionen

int main ()
{

	//Strucktur Felder

	struct st_Felder  {
	
	bool bFeldstatus;
	char chFeldName[10];
	int Yposi;
	int Xposi;

	};
	
	
	
	//Variabeln
	int xEingabe;
	int yEingabe;
	int Auswahl;
	int FelderDurchzaehler;
	st_Felder Felder[25];
	FelderDurchzaehler = 0;
	
	
	//Felder zuweißungs schleife

	for (int i = 1; i < 6 ; i++)
	{
		for (int j = 1; j < 6 ; j++)
		{

			Felder[FelderDurchzaehler].Yposi = i;
			cout << "Koordinaten von Feld "<< FelderDurchzaehler+1  << " Y-posi: " << Felder[FelderDurchzaehler].Yposi;
			Felder[FelderDurchzaehler].Xposi = j;
			cout << " X-posi:  " << Felder[FelderDurchzaehler].Xposi << endl;
			FelderDurchzaehler ++;

		}
	}
	
	
	//Menü Schleife
		
		do {

		cout << "     Feldmaster 1.0" << endl;
		cout << "-----------------------" << endl;
		cout << "1. Spielfeld anzeigen" << endl;
		cout << "2. Feld besetzen" << endl;
		cout << "3. Felddaten anzeigen" << endl;
		cout << "4. Spielfeld löschen" << endl;
		cout << "5. Programm benden" << endl;

		cin >> Auswahl;

		cout << "\n\n" << Auswahl << "\n\n";

		
		//Menü Auswahl
		switch(Auswahl)
		{
			//Spielfeld schreiben
			cout << "\n\n" << Auswahl << "\n\n";
			case(1):
			{
				FelderDurchzaehler = 0;
				
				for (int i = 1; i < 6 ; i++)
				{
					for (int j = 1; j < 6 ; j++)
					{

						if (Felder[FelderDurchzaehler].bFeldstatus == true)
						{ 
							cout << "X";
						}
						else
						{
						   cout << "-";
						}
							
						FelderDurchzaehler ++;

					}
					
					cout << endl;
				}
			}break;
			//Feld besetzen
			case(2):
			{
				cout << "Gebe X-Wert ein: ";
				cin >> xEingabe;
				cout << "Gebe Y-Wert ein: ";
				cin >> yEingabe;
				cout << "Gebe einen Namen für das Feld ein: ";
				
				for(int g = 0; g<25; g++ )
				{
					if ( Felder[g].Yposi == yEingabe )
					{
						if (Felder[g].Xposi == xEingabe )
						{
							Felder[g].bFeldstatus = true;	
							cout << "Feld" << g << "mit den Koordinaten " << Felder[g].Xposi << " und " << Felder[g].Yposi <<	" wurde true" << endl;				
							cout << "Gebe einen Namen für das Feld ein: ";
							cin.get (Felder[g].chFeldName, 10);
							cin.ignore;
						}
				
					}
				}

				
			}break;
			//Felddaten anzeigen
			case(3):
			{
				cout << "Felddaten anzeigen" << endl;
			}break;
			//Spielfeld loeschen
			case(4):
			{
				cout << "Spielfeld loeschen" << endl;
			}break;
			//Spiel bennden
			case (5):
			{
				cout << "Vielen Dank fuers benutzen von Feldmaster 1.0" << endl;
			}break;
			//Falsche eingabe
			default:
			cout << "Bitte Zahl von 1-5 Ausweahlen" << endl;
		}
		
		cout << endl;


	} while(Auswahl != 5);

	return 0;

}

Ich würde mich freuen, wenn mir jemand helfen würde :)
 
AW: [C++] Fehler im Programm.. Weiß nicht warum :(

Hi,

als erstes mal würde ich dir vorschlagen deine Schleifen umzubauen.
Du läufst in deinen Schleifen immer von x=1 bis x = arrayLänge.
Dabei sollte in deinem Buch eigentlich fett drinnstehen, dass Arrayindizes immer bei 0 anfangen, und bis Arraylänge -1 gehen.

Desweiteren frage ich mich wieso du die Position deiner Elemente als Member speicherst. Normalerweise sollte es hier auch ein 2-dimensionales Array tun.
Code:
    struct st_Felder  {
    
    bool bFeldstatus;
    char chFeldName[10];
    };

    Felder st_Felder[5][5];

    //initialisierung
    for(int i = 0; i < 5; i++)
    {
        for(int j = 0; j < 5; j++)
        {
            Felder[i][j].bFeldstatus = false;
            Felder[i][j].chFeldName[0] = '\0';
        }
    }

Wenn du in deinem Array von 1...25 durchzählst, du also versucht auf Felder[25] zuzugreifen, versuchst du auf das 26. Element des Arrays zuzugreifen. Da das Array aber nur eine Größe von 25 hat, landest du irgendwo außerhalb des für das Array reservierten Speichers, was meistens zu einem Segmentation Fault führt.

Im Grunde kann man auf das status-Flag auch noch verzichten, wenn man das char-array richtig initialisiert und dann prüft das erste zeichen = \0 ist.
Dann hätte man dann letzten Endes ein 3-dimensionales Array.

Code:
char Felder[5][5][10];
 
Zuletzt bearbeitet:
Zurück
Oben