Zum Inhalt springen

Problem beim Ausführen des Programms


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...