Merkwürdige Ausgabe



  • Hi,
    habe ein Menu mit verschiedenen Auswahlpunkten. Egal, welchen ich auswähle ich bekomme überall Sterne, Hyroglyphen, etc.
    Bei einem Punkt bekomme ich "check failure# 3" oder wie der heißt. Obwohl meine Variable deklariert ist. Ich weiß nimmer weiter, woran das liegen kann.
    Alles, was mir eingefallen ist, was ich zuletzt geändert hab, hab ich rückgängig gemacht, ohne erfolg. ich verzweifel langsam.
    ich hoffe, mir kann jmd. von euch helfen.
    hier mal meine main:

    int main()								// Hauptprogramm
    {
    	for (int z=0; z<gesNr; z++)			
    		{	for (int Zaehler=0; Zaehler < 20; Zaehler++)
    			{	Mitglied[z].Name[Zaehler]=' ';	// alle Namen werden auf leer gesetzt
    				Mitglied[z].Beitrag='n';
    			}							// alle Beiträge werden auf null gesetzt
    		}
    
    	PWAbfrage();						// Aufruf der Funktion PWAbfrage()
    
    	return 0;
    }
    

    mein Menu:

    void Menu()
    {
    
    	int Auswahl=0;
    	do							// Schleife läuft solange Auswahl ungleich null ist
    	{
    		system("cls");
    		cout << "\n\tMenu:";	// Ausgabe des Menus
    		cout << "\n\t~~~~~";
    		cout << "\n\n1 --> Neues Mitglied erfassen";
    		cout << "\n2 --> Mitgliederdetails anzeigen";
    		cout << "\n3 --> Mitgliedsdetails aendern";
    		cout << "\n4 --> Mitglied loeschen";
    		cout << "\n5 --> Beitrag einzahlen";
    		cout << "\n6 --> Kontostand anzeigen";
    
    		cout << "\n\n9 --> abmelden";
    		cout << "\n0 --> Programm beenden";
    
    		cout << "\n\nEingabe:\t";
    		cin >> Auswahl;			// Eingabe der Auswahl
    
    		switch (Auswahl)		// Mehrfachauswahl, je nach Eingabe wird die
    		{						// entsprechende Funktion aufgerufen
    			case 1:
    				MitgliedNeu();
    				break;
    
    			case 2:
    				MitgliederAnz();
    				break;
    
    			case 3:
    				MitgliedAender();
    				break;
    
    			case 4:
    				MitgliedLoesch();
    				break;
    
    			case 5:
    				BeitragZahl();
    				break;
    
    			case 6:
    				Kontostand();
    				break;
    
    			case 9:
    				PWAbfrage();
    				break;
    
    			case 0:
    				exit(1);		// Exit-Funktion, muss aufgerufen werden, sonst wird 
    				break;			// nur abgemeldet
    
    			default:
    				cout << "\n\t\aFalsche Eingabe!";
    				getch();
    				break;
    		}
    	}
    	while (Auswahl != 0);
    }
    

    und der Punkt, wo ich neue Mitglieder einlese:

    void MitgliedNeu()
    {
    
    	char Eingabe;
    
    	do			// Schleife, soll solange laufen, wie Eingabe gleich j.
    	{
    		for (int Zaehler=0; Zaehler<gesNr; Zaehler++)		// Schleife erhöht den Zähler Zaehler bei jedem Durchlauf um 1
    		{	if (Mitglied[Zaehler].Name.length()==0)	// Überprüfung, ob Name leer
    										// somit wird der erste leere Eintrag beschrieben
    			{	
    				system("cls");
    				cout << "\n\tNeues Mitglied erfassen:";
    				cout << "\n\t~~~~~~~~~~~~~~~~~~~~~~~~";
    
    				cout << "\n\nBitte geben Sie nacheinander die gefragten Daten ein.";
    
    				cout << "\n\nName:\t\t\t";		// Eingabe der gefragten Namen
    				getline (cin, Mitglied[Zaehler].Name);
    
    				cout << "\nVorname:\t\t";
    				getline (cin, Mitglied[Zaehler].Vorname);
    
    				cout << "\nStrasse und Nr.:\t";
    				getline (cin, Mitglied[Zaehler].StrasseNr);
    
    				do			// Schleife zur Vermeidung der Eingabe einer falschen PLZ
    				{	cout << "\nPLZ:\t\t\t";
    					cin >> Mitglied[Zaehler].PLZ;		// PLZ als int
    					if ((Mitglied[Zaehler].PLZ < 10000) || (Mitglied[Zaehler].PLZ > 99999))
    					{	cout << "\n\t\afalsche Eingabe!!!";
    					}
    				}
    				while ((Mitglied[Zaehler].PLZ < 10000) || (Mitglied[Zaehler].PLZ > 99999));
    
    				cout << "\n\nOrt:\t\t\t";
    				getline (cin, Mitglied[Zaehler].Ort);
    
    				do		// Schleife zur Vermeidung der Eingabe eines falschen Geburtsjahres
    				{	cout << "\nGeburtsjahr:\t\t";
    					cin >> Mitglied[Zaehler].GebJahr;		// Geburtsjahr als int
    					if ((Mitglied[Zaehler].GebJahr < 1900) || (Mitglied[Zaehler].GebJahr > 3000))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].GebJahr < 1900) || (Mitglied[Zaehler].GebJahr > 3000)); 
    
    				do		// Schleife zur Vermeidung der Eingabe eines falschen Geburtsmonats
    				{	cout << "\nGeburtsmonat:\t\t";
    					cin >> Mitglied[Zaehler].GebMonat;	// Geburtsmonat als int
    					if ((Mitglied[Zaehler].GebMonat < 1) || (Mitglied[Zaehler].GebMonat > 12))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].GebMonat < 1) || (Mitglied[Zaehler].GebMonat > 12));
    
    				do	// Schleife zur Vermeidung der Eingabe eines falschen Geburtstages
    				{	cout << "\nGeburtstag:\t\t";
    					cin >> Mitglied[Zaehler].GebTag;		//Geburtstag als int
    					if ((Mitglied[Zaehler].GebTag < 1) || (Mitglied[Zaehler].GebTag > 31))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].GebTag < 1) || (Mitglied[Zaehler].GebTag > 31));
    
    				do	// Schleife zur Vermeidung der Eingabe eines falschen Monats
    				{	cout << "\nMitglied seit (Monat):\t";
    				cin >> Mitglied[Zaehler].MitgliedMon;		// Mitgliedmonat als int
    				}
    				while ((Mitglied[Zaehler].MitgliedMon < 1) || (Mitglied[Zaehler].MitgliedMon > 12));
    
    				do	// Schleife zur Vermeidung der Eingabe eines falschen Mitgliedsjahres
    				{	cout << "\nMitglied seit (Jahr):\t";
    					cin >> Mitglied[Zaehler].MitgliedJahr;	// Mitgliedsjahr als int
    					if ((Mitglied[Zaehler].MitgliedJahr < 1900) || (Mitglied[Zaehler].MitgliedJahr > 3000)
    						|| (Mitglied[Zaehler].MitgliedJahr < Mitglied[Zaehler].GebJahr))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].MitgliedJahr < 1900) || (Mitglied[Zaehler].MitgliedJahr > 3000)
    					|| (Mitglied[Zaehler].MitgliedJahr < Mitglied[Zaehler].GebJahr));
    
    				cout << "\nTelefonnr:\t\t";
    				cin >> Mitglied[Zaehler].Tel;		// Telnummer als string
    
    				cout << "\nBeitrag gezahlt? (j/n):\t";
    				cin >> Mitglied[Zaehler].Beitrag;		// Beitrag als char
    				if (Mitglied[Zaehler].Beitrag == 'j')	// Erhöhung des Kontostandes bei
    				{	Konto=Konto+3;				// Einzahlung des Beitrags
    				}
    
    				cout << "\nMoechten Sie ein weiteres Mitglied einlesen?\t";
    				cin >> Eingabe;	
    				if (Eingabe == 'n')		// ohne diese Abbruchbedingung läuft die
    				{	break;				// Schleife auch bei Eingabe n weiter.
    				}						// Kann mir nicht erklären, warum.
    
    			}
    
    		}
    
    	}while (Eingabe == 'j');		// bei anderer Eingabe soll die Schleife aufhören,
    									// tut sie aber nicht
    	Menu();
    }
    


  • Debugger.



  • was soll ich damit machen???? habe schon mit laufen lassen, aber es ändert nix. der fehler kommt und auch diese ausgaben.



  • Der soll auch nichts ändern, aber mit dem Debugger könntest du rausfinden wo die Ausgaben (könntest die evlt. posten?) auftreten.



  • Erstens: Was für einen Typ hat Mitglied? (komplette struct/class-Definition)
    Zweitens: Du hast dort eine Endlosrekursion eingebaut: "Menu()" ruft "MitgliedNeu()" ruft "Menu()" ruft... (da reicht am Ende der Funktion ein return; um zum drüberliegenden Menu() zurückzukehren).
    Drittens: Verfolge doch mal im Debugger genau den Ablauf nach, der zu einem falschen Ergebnis führt.



  • Debuggers don't remove bugs, they only show them in slow-motion.



  • dass die Funktionen gegenseitig aufgerufen werden ist beabsichtigt. wenn man einen neuen user angelegt hat, und dann keinen weiteren anlegen will, kommt man ins menu. passt doch so, oder nicht?

    hier meine struktur:

    struct Mitglieddetails		// Stuktur zur Verwaltung der Mitgliederdaten, ebenfalls
    	{						// global, da aus verschiedenen Funktionen darauf
    	string Name;			// zugegriffen wird
    	string Vorname;
    	string StrasseNr;
    	int PLZ;
    	string Ort;
    	int GebTag;
    	int GebMonat;
    	int GebJahr;
    	int MitgliedMon;
    	int MitgliedJahr;
    	int Tel;
    	char Beitrag;
    	};
    
    Mitglieddetails Mitglied[gesNr];		// Initialisierung der Struktur
    

    der fehler tritt in der vorletzten zeile der funktion "MitgliedNeu" auf. [while (Eingabe == 'j');]



  • Mit dieser Definition ist auf jeden Fall deine Initialisierungsschleife unsinnig (bzw. greift auf fremden Speicher zu). Reduziere das mal zu:

    for (int z=0; z<gesNr; z++)            
    {
      Mitglied[z].Name="";    // alle Namen werden auf leer gesetzt
      Mitglied[z].Beitrag='n';// alle Beiträge werden auf null gesetzt
    }
    

    @Funktionen: Wenn du die Funktion MitgliedNeu() beendest, landest du wieder an der Stelle, wo du hergekommen bist - und das sollte die Menu()-Funktion sein.



  • das stammte noch aus der zeit, bevor ich alles verändert habe, dabei habe ich das verändert. danke.
    und schon funzt alles, wie es soll. danke nochmal!!!!!!!


Anmelden zum Antworten