Akaria Geschrieben 8. Mai 2009 Teilen Geschrieben 8. Mai 2009 Hallo, hab mal wieder ein problem und zwar, wenn ich das Programm jetzt ausführe, bricht es nach der ersten eingabe ab. Bekomme dann immer nen Error mit der begründung "abnormal program termination". Quellcode ist aber soweit ok (laut kompiler, sonst könnte ich es ja nicht ausführen) Software: immer noch Visual C++ 6.0 Quellcode: int testen() {string kto = ktn; for(int o=0; o>=ktngr; o++) { string sub= kto.substr(o,1); //cout<<sub<<endl; if(sub!="0") {} else { if(sub!="1") { } else { if(sub!="2") { } else { if(sub!="3") { } else { if(sub!="4") { } else { if(sub!="5") { } else { if(sub!="6") { } else { if(sub!="7") { } else { if(sub!="8") { } else { if(sub!="9") { } else { cout<<"Bitte NUR Zahlen eingeben! " <<endl; } } } } } } } } } } } return o; } kann es daran liegen, dass es nicht "int testen()" heißen darf, sondern void? Wenn ja, was muss ich dann zurück geben lassen? Wenn ich return sub; nehme sagt der kompiler sub wäre nicht deklariert. Oder liegt es vielleicht daran, dass ich ktn mehrmals in substrings unterteile? Hab daher aus ktn auch kto gemacht, aber dadurch löst sich der fehler auch nicht auf. Achja testen ist eingebettet in der void main() cout<<"Bitte geben Sie ihre Kontonummer ein" <<endl; cin>> ktn; testen(); cout <<"Bitte geben Sie nun Ihre BLZ ein" <<endl; cin>>blz; [...] Sorry, wegen der klammern, leider werden hier die tabs nicht mitgenommen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. Mai 2009 Teilen Geschrieben 8. Mai 2009 Quellcode ist aber soweit ok (laut kompiler, sonst könnte ich es ja nicht ausführen)Diese Schlussfolgerung ist falsch. Der Compiler versucht, dein Programm zu übersetzen. Selbst wenn ihm das gelingt, können da immer noch jede Menge logischer Fehler drin sein, d.h. das Programm tut nicht, was es soll. kann es daran liegen, dass es nicht "int testen()" heißen darf, sondern void? Wenn ja, was muss ich dann zurück geben lassen?Kommt drauf an. Was hast du dir bei dem Rückgabewert denn gedacht? Welchen Zweck soll er erfüllen? Soll er wiedergeben, ob der Test erfolgreich war? Du wertest den Rückgabewert in main jedenfalls nicht aus. Ein paar logische Fehler fallen mir sofort auf: Die Bedingung einer for-Schleife (bei dir o>=ktngr) bestimmt, wie lange die Schleife ausgeführt wird. In deinem Fall wird die Schleife überhaupt nicht ausgeführt, weil o gleich 0 ist, und ktngr vermutlich größer. Die Schleifenbedingung ist keine "Abbruchbedingung", auch wenn man sie oft so nennt, sondern eigentlich eine "Weitermachbedingung". Dein if-Konstrukt ist auch logisch falsch. Wenn die erste Bedingung nicht zutrifft, also sub == "0" ist, dann ist die nächste immer wahr, denn "0" ist immer != "1". Der Rest des Konstrukts wird nie betreten. Der Absturz passiert meiner Meinung nach an einer anderen Stelle des Codes, die du nicht gezeigt hast. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Akaria Geschrieben 8. Mai 2009 Autor Teilen Geschrieben 8. Mai 2009 Die Bedingung einer for-Schleife (bei dir o>=ktngr) bestimmt, wie lange die Schleife ausgeführt wird. In deinem Fall wird die Schleife überhaupt nicht ausgeführt, weil o gleich 0 ist, und ktngr vermutlich größer. Die Schleifenbedingung ist keine "Abbruchbedingung", auch wenn man sie oft so nennt, sondern eigentlich eine "Weitermachbedingung". Das ist gut möglich, aber ich glaube es funktioniert doch, denn wenn ich das cout (welches ich wegkommentiert habe) drin lasse, dann gibt er mit die eingegebenen zahlen aus (wie er es ja auch sollte), leider hängt er immer noch ne Null hinten dran (bsp: 1234 eingegeben ausgabe 1 2 3 4 0) Dein if-Konstrukt ist auch logisch falsch. Wenn die erste Bedingung nicht zutrifft, also sub == "0" ist, dann ist die nächste immer wahr, denn "0" ist immer != "1". Der Rest des Konstrukts wird nie betreten. Sicher? Das testen soll ja den eingegebenen string einfach nur in ein substring setzten der aus einem zeichen besteht (erst die erste stelle, dann die 2 stelle ...) string sub= kto.substr(o,1); Dann soll mit den if bedingungen überprüft werden, ob es sich um KEINE Zahl handelt, daher !=0 etc. Wenn da jetzt ein Buchstabe steht, dann ist dieser !=0 und !=1 etc und landet dann unten schließlich beim else mit der ausgabe. Der Absturz passiert meiner Meinung nach an einer anderen Stelle des Codes, die du nicht gezeigt hast. Der Absturz muss dort passieren, da das Programm ohne test() wunderbar funktioniert. Ich komm ja nicht mal bis zum einlesen der blz. das letzte was er ausgibt sind die eingelesenen zeichen als substring Ich hoffe du verstehst was ich meine Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. Mai 2009 Teilen Geschrieben 8. Mai 2009 Das ist gut möglich, aber ich glaube es funktioniert doch, denn wenn ich das cout (welches ich wegkommentiert habe) drin lasse, dann gibt er mit die eingegebenen zahlen aus (wie er es ja auch sollte), leider hängt er immer noch ne Null hinten dran (bsp: 1234 eingegeben ausgabe 1 2 3 4 0)Welchen Wert hat denn ktngr? Sicher? Das testen soll ja den eingegebenen string einfach nur in ein substring setzten der aus einem zeichen besteht (erst die erste stelle, dann die 2 stelle ...) Dann soll mit den if bedingungen überprüft werden, ob es sich um KEINE Zahl handelt, daher !=0 etc. Wenn da jetzt ein Buchstabe steht, dann ist dieser !=0 und !=1 etc und landet dann unten schließlich beim else mit der ausgabe.Die Absicht ist klar. Das tut der Code aber nicht. Dein erstes if prüft auf != "0". Das trifft doch bereits auf jedes unerwünschte Zeichen zu, oder etwa nicht? Im wahr-Zweig dieser Abfrage tust du aber nichts. Der Absturz muss dort passieren, da das Programm ohne test() wunderbar funktioniert.Auch diese Schlussfolgerung ist falsch. Gerade wenn man globale Variablen verwendet (was man übrigens nicht sollte), kann es sein, dass zusätzlicher Code nur die Bedingung für den restlichen Code so ändert, dass es an einer anderen Stelle knallt. Wenn du genau herausfinden willst, wo dein Programm abstürzt, musst du einen Debugger benutzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Akaria Geschrieben 8. Mai 2009 Autor Teilen Geschrieben 8. Mai 2009 Welchen Wert hat denn ktngr? je nach dem was wie groß die blz ist, kann ktngr 10, 11 oder 16 sein. Hab auch gerade das testen im quellcode weiter nach hinten geschoben, da er vorher noch kein ktngr hatte (die abschnitte wurden erst hinterher berechnet), Programm geht aber trotzdem nicht. Dein erstes if prüft auf != "0". Das trifft doch bereits auf jedes unerwünschte Zeichen zu, oder etwa nicht? Im wahr-Zweig dieser Abfrage tust du aber nichts. Ach sch** jetzt seh ich das erst. Dann kann ich die if bedingungen ja untereinander schreiben und nicht so verschachtet, außerdem muss es dann =="0" heißen. Auch diese Schlussfolgerung ist falsch. Gerade wenn man globale Variablen verwendet (was man übrigens nicht sollte), kann es sein, dass zusätzlicher Code nur die Bedingung für den restlichen Code so ändert, dass es an einer anderen Stelle knallt. Wenn du genau herausfinden willst, wo dein Programm abstürzt, musst du einen Debugger benutzen. Ok, daran hab ich nicht gedacht. Ich werd mal sehen, welche variabeln ich umsetzen kann. Global ist halt einfacher, daher hab ich das so gemacht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_n4p_ Geschrieben 16. Mai 2009 Teilen Geschrieben 16. Mai 2009 Dann kann ich die if bedingungen ja untereinander schreiben und nicht so verschachtet, außerdem muss es dann =="0" heißen. es reicht sogar ein einziges if int testen(string kto) { int strlen = kto.length(); int value = 0; for(int o=0; o<=strlen; o++) { string sub= kto.substr(o,1); if ((sub != "0") || (sub != "1") || (sub != "2") || (sub != "3") || (sub != "4") || (sub != "5") || (sub != "6") || (sub != "7") || (sub != "8") || (sub != "9")) { cout<<"Bitte NUR Zahlen eingeben! " <<endl; value = 1; } return value; } } oder noch besser int testen(string kto) { int value = 0; string zahlen = "0123456789"; if (kto.find_first_not_of(zahlen) == string::npos) { cout<<"Bitte NUR Zahlen eingeben! " <<endl; value = 1; } return value; } } main muss natürlich angepasst werden if (testen(ktn) == 1) { //was auch immer } else { // weiter im text } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.