probleme mit der standardausgabe cout/printf
-
1. Deinen Code wird wohl kaum jemand anschauen.
2. Deine Fehlerbeschreibung ist miserabel. Was heisst "stehen bleiben"? Hüpft dein Computer auf den Tisch und bleibt dort stehen?
3. Zeig doch einfach mal die Codestelle mit ein bisschen davor und danach, wo er "stehen bleibt".
4. Oder probier die Sache in einem kleinen minimalen Beispiel zu reproduzieren und zeig diesen Code hier.Beim Zeigen bitte [cpp]-Tags verwenden.
Grüssli
-
int Token::towOut(char chr1, char chr2){ if(chr1 == '('){ cout << "<LPAREN>\n"; return 1; } if(chr1 == ')'){ cout << "<RPAREN>\n"; return 1; } if(chr1 == '{'){ cout << "<LBRACE>\n"; return 1; } if(chr1 == '}'){ cout << "<RBRACE>\n"; return 1; } //... geht so analog weiter für noch mehr zeichen return 0; }In der Methode bleibt er stehen irgendwann(also damit mein ich er macht er gibt eine ganze menge token aus und dann ohne grund stillstand). Und zwar direkt hinter einem der cout Anweisungen. Also er kommt nicht bis zum return. In der Konsole gehts nicht weiter und ich muss das Programm abbrechen und ich weiss nicht wieso. Ich habe es mit Testausgaben herausgefunden das er zwar die cout-Anweisung bearbeitet aber nicht zum return kommt.
-
Du meinst doch nicht etwa, dass das
return 0am Ende der Funktion nicht erreicht wird?P.S. Du kennst hoffentlich
switch?Noch was: Wie gesagt [cpp]-Tags und nicht [code]-Tags verwenden.
-
Wie sieht das Aufrufen von towOut aus?
-
Nebst dem was Nexus gesagt hat:
Bist du schon mal mit dem Debugger durchgegangen?Grüssli
-
nein das wird immer erreicht. aber er erreicht nach paar Tokens die return 1 statements nicht mehr. er kommt in die if-Fälle hinein und macht auch noch das cout aber dann stoppt das Programm.
void Scanner::scan(string inp) { int i = 0; int tokenBegin = 0; Token* token = new Token(); List* list = new List(); while(inp[i] != '\0') { //... noch einige andere fälle else { int twoletters = token->towOut(inp[i],inp[i+1]); if(twoletters == 1) i++; else if(twoletters == 2) i+=2; else { cout << "<ERROR>"; exit(0); } } } token->printMax(); }dort ist der Aufruf von towOut(). Aber wie gesagt bleibt er erst mitten in towOut stehen.
-
Das mit dem debuggen ist halt so eine Sache... Ich habs in Linux entwickelt und kenn mich da leider nicht aus. Aber wenn jemand eine gute IDE kennt wo man auch super debuggen kann bin ich sehr offen für diese Vorschläge

-
-
-
KDevelop
-
while(inp[i] != '\0') { ///Sowas ist eigentlich nicht so günstig. Verwende besser std::string::const_iterator (begin(), end()) oder vergleiche auf length()/size().
Es ist gut möglich dass du in nen Überlauf rein rennst, wenn du ungeprüft i+1 übergibst oder i+=2 machst.
Den MemoryLeak hast du auch gesehen? Leg doch token und List in den automatischen Speicherbereich.
Token token; List list;Zu guter Letzt: KDevelop4++

-
ok habs gefixed.
-
TiakaniZ schrieb:
ok habs gefixed.
Wäre noch interessant zu wissen, wo der Fehler gelegen hat.

-
noch einmal danke für die vielen antworten

-
Es war in einer while-schleife.... ich war echt so dumm und hab in einer liste nicht den zeiger aufs nächste elemnt gesetzt und deshalb gabs ne endlosschleife... habs auch erst mit debug rausbekommen xD