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 Strukturder 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!!!!!!!