probleme mit der standardausgabe cout/printf
-
Hallo Leute!

Zunächst erkläre ich ein bisschen das Programm bevor ich zum problem komme. ALso das Programm ist ein Scanner welcher eine Quellcode-Datei (eigene Sprache) als Eingabe nimmt und alle Token in ihrer Reihenfolge nach dem Auftreten in die Konsole ausgeben.
Das Projekt umfasst mehrere Dateien:
a2.cpp - hier wird nur die Datei eingelesen und evtl. Fehler abgefangen
Scanner.cpp - hier werden die Token Stück für Stück ausgelesen und als Teilstrings an die Klasse Token weitergegeben zur weiteren Verarbeitung bzw. zur Ausgabe
Token.cpp - hier werden die Teilstrings vom Scanner verarbeitet(welches Token genau?) und danach in einheitlicher Form ausgegeben
Zu den Dateien gibt es jeweils noch einen Header.
Am Ende des Scanvorgangs wird noch der häufigster Bezeichner ausgebenen.
Das Programm habe ich nunter Linux entwickelt.Nun zum Problem: Mein Programm scannt soweit ganz gut und richtig nur bleibt es irgendwann einfach stehen ohne Fehler und in der Konsole geht es dann nicht weiter! ich habe herausgefunden dass es irgendwie mit cout zu tun haben muss, da er dort einfach stehen bleibt und nicht weiter macht.
Hier mal das Programm zum downloaden:
http://rapidshare.com/files/386947877/a2.tar.gz.htmlBei dem Programm liegt ein make-File bei sowie eine Datei TEST_ALL.bin mit welcher ihr den Fehler rekonstruieren könnt.
Ich hoffe ihr könnt mir helfen denn ich finde den Fehler einfach nciht!
Danke im voraus!

-
Also ich lad bestimmt nicht dein Projekt runter und teste für dich, aber hohe Wahrscheinlichkeit hast du dem Scanner nicht gesagt, dass er mit EOF beenden soll.
Wahrscheinlich hast du Flex/Bison eingesetzt, dann solltest du mal in die Dokumentation gucken.
-
Ich habe eben kein flex/bison benutzt. Der Scanner ist selbst geschrieben. Und der Scanvorgang ist noch nciht einmal am Ende der Datei angekommen und bleibt stehen... und zwar mitten in vor bzw. nach einem cout und ich weiss einfach nicht warum. er kommt nach einem cout nicht mal zum return-Statement.
-
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