stack-problem
-
Huhu
Hab ein kleines Problem mit meinem Programm. Was das Prog machen soll ist schnell erklärt. Es liest aus der angegebenen Datei die Klammern raus und überprüft ob die Klammern richtig oder falsch gesetzt sind (über den Nutzwert
des Progs wollen wir mal nicht reden! *g*).#include <stdio.h> #include <stdlib.h> #define MAX 1000 #define NIL '\0' typedef struct { int max; int top; char stackArray[MAX+1]; } Stapel; void init_Stapel( Stapel* stapel ); int falsche_klammer( Stapel* stapel, char key ); int empty( Stapel* stapel ); char pop( Stapel* stapel ); void push( Stapel* stapel, char key ); char top( Stapel* stapel ); int full( Stapel* stapel ); void print_Stapel ( Stapel* stapel ); int main (int argc, char* argv[]) { int quotation = 0; if (argc!=2) { printf("Format : klammer [dateiname]"); return; } char key; FILE* datei; Stapel* stapel; init_Stapel (stapel); datei = fopen(argv[1],"rt"); if (datei==NULL) { printf("Datei nicht lesbar.\n"); return; } while (key != EOF) { key = getc(datei); putchar(key); if (key=='\"'||key=='\'') { quotation++; } if (quotation%2==0) { switch (key) { case '{': case '(': case '[': push (stapel, key); break; case '}': case ')': case ']': if (falsche_klammer (stapel,key) == 1) { printf("Klammerung falsch!"); return; } push (stapel,key); } } } fclose(datei); print_Stapel(stapel); return 0; } void init_Stapel ( Stapel* stapel ) { stapel->max = MAX; stapel->top = 0; stapel->stackArray[0] = NIL; } int falsche_klammer ( Stapel* stapel, char key ) { if (stapel->top==0) { return 1; } if (key==')'&&((top(stapel)=='{')||(top(stapel)=='['))) { return 1; } if (key=='}'&&((top(stapel)=='(')||(top(stapel)=='['))) { return 1; } if (key==']'&&((top(stapel)=='{')||(top(stapel)=='('))) { return 1; } if (stapel->top==0) { return 1; } return 0; } int empty ( Stapel* stapel ) { return stapel->top == 0; } char pop ( Stapel* stapel ) { if ( empty( stapel ) ) { printf ( "ERROR: stack underflow" ); return stapel->stackArray[stapel->top]; } else { stapel->top--; return stapel->stackArray[stapel->top+1]; } } void push ( Stapel* stapel, char key ) { if ( full( stapel ) ) printf ( "ERROR: stack overflow" ); else { stapel->top++; stapel->stackArray[stapel->top] = key; } printf("<ARRAY [%d]>", stapel->top); } char top ( Stapel* stapel ) { return stapel->stackArray[stapel->top]; } int full ( Stapel* stapel ) { return stapel->top == stapel->max; } void print_Stapel ( Stapel* stapel ) { int i=1; do { printf("\n CharArray[%d] : %c", i, stapel->stackArray[i]); i++; } while (i<stapel->top); }
das 'putchar' und die Zeile 'printf("<ARRAY [%d]>", stapel->top);' hab ich nur mal zur Überprüfung eingebaut. Das Programm läuft nicht zuende durch wenn ich es mit sich selbst austeste weil die print_Stapel Funk. nichtmehr ausgeführt wird.
Stattdessen bleibt die Ausgabe des progs nach <ARRAY [87]> und der darauf folgenden Klammer stehen. Kommt auch keine Fehlermeldung von Windows
-
niemand ne ahnung ?
-
Hier scheint mir ein schwerwiegender Fehler drinzustecken:
while (key != EOF) { key = getc(datei); putchar(key); if (key=='\"'||key=='\'') { quotation++; } if (quotation%2==0) { switch (key) { case '{': case '(': case '[': push (stapel, key); break; case '}': case ')': case ']': if (falsche_klammer (stapel,key) == 1) { printf("Klammerung falsch!"); return; } push (stapel,key); } } }
angenommen, du läufst über "'". quotation hat danach den Wert 3, dh du zählst folgende Klammern nicht und kommst aus dem Tritt. Läufst du über "\"", ebenfalls. 2 Zustände sind einfach zu wenig, um C++ zu scannen.
Eigentlich mußt du auch auf solche Perversitäten achten:
/* "\ " foo */ "; bar(" // ");
-
Du legst keine Speicher für stapel an. Da kann alles passieren.
Wenn ich das richtig sehe, ist das auch kein C.
-
Und woran siehst du das?
mfg
v R
-
Original erstellt von MFK:
Wenn ich das richtig sehe, ist das auch kein C.Natürlich ist das C. Warum denn nicht?
-
Möglicherweise, weil er aus main mit einem einfachen return; rausspringt, oder weil er bei fopen "rt" verwendet.
-
Stimmt, 't' als Lesemodus ist nicht ANSI. Aber er macht doch return 0;
EDIT: Uuups, habs gesehen. Oben macht er ein normales return;
[ Dieser Beitrag wurde am 21.05.2003 um 15:04 Uhr von MaSTaH editiert. ]
-
ob das mit dem "rt" nun nich C ist will ich bestreiten.. bei nem andren prog funzt es
aber ich kann doch aus dem main einfach mit return das prog beenden oder ?@MFK
ich deklarier stapel doch.. reicht das denn nich ?
@Bashar
stimmt schon das ich noch nicht alle Möglichkeiten bedacht habe, aber erstmal will ich das das Programm bis zum Ende durchläuft bevor ich mich da ran setze[ Dieser Beitrag wurde am 21.05.2003 um 18:39 Uhr von raffnix editiert. ]
-
ok, mein problem ist gelöst
hab einfach unter "Stapel*stapel" noch "Stapel stack" und "stapel = &stack" geschrieben. Ist wohl doch so das die Deklaration des Pointers alleine nicht den Speicher für das Array sichert.. Naja wieder was gelernt
Nochmal thx @ MFK