Schachtelungsanalyse
-
wir müssen in einem programm schauen, ob bei der geöffneten *.c datei die klammernd korrekt gesetzt wurden. allerdings kriege ich gerade eine endlosschleife

auf die schnelle ahbe ich jetzt nichts gefunden, aber vllt hat jemand bessere argusaugen
/*Information der Datei */ typedef struct { unsigned int lines; unsigned int openbracket; /* {diese Art von Klammer*/ unsigned int scomment; /* /* sind wir in einem Kommentar drin*/ unsigned int rcomment; /*runde klammer*/ } FileInfo; int const maxlinelength=100; /*maximale Zeilenlänge*/ void counter (char *str, FileInfo *info); static short readFile(FILE* file, FileInfo* info); void counter (char *str, FileInfo *info) /* Fkt zum Zaehlen der Klammern */ { int i; for (i=0; i <= strlen(str); i++) { if(!info->scomment) {/*auf Klammerart überprüfen*/ switch (str[i]) { case '{': info->openbracket++; break; case '}': info->openbracket--; break; case '(': info->rcomment++; break; case ')': info->rcomment--; break; case '/': /*schauen ob wir in einem Blockkommentar drin sind*/ if(str[i+1]=='*') { info->scomment=1; str++; /*auf das nächste zeichen zeigen*/ } break; } if(info->scomment==1 && str[i]=='*') /*schauen ob Blockkommentar zu Ende gegangen ist*/ { if(str[i+1]=='/') { info->scomment=0; str++; } } } } } static short readFile(FILE* file, FileInfo* info) { char data[maxlinelength]; /*angenommene Zeilenlänge */ while ( fgets(data,maxlinelength,file) != EOF) /*ganze Zeile lesen*/ { info->lines++; counter(data,info); printf("%u: {%d} (%d) /*%d*/ |",info->lines,info->openbracket,info->rcomment,info->scomment); puts(data); } /*Pruefung auf Fehler beim Lesen*/ if (ferror(file) !=0) {return NOK; } return OK; }im main rufe ich es folgendermaßen auf:
//Datei zum lesen oeffnen FILE* file =fopen(argv[1], "r"); if (file == 0) { fprintf(stderr,"error in fopen"); return EXIT_FAILURE; } ´if(readFile(file,&info)==NOK) { fprintf(stderr,"error in readFile"); return EXIT_FAILURE; }die NOK und OK variablen dienen als bool-ersatz(short int)
-
Dann schau mal nach, wann du den Kommentar wieder ausschaltest.
Wenn deine Einrueckung stimmt, dann machst du das nie.Eine Schleife ueber einen String prueft man in C auch nicht mit
strlen()sondern auf den Terminator:for (i=0; str[i] != '\0'; i++)
-
habe es jetzt geändert, allerdings scheint es immer noch nicht zu passen
for (i=0; str[i]!='\0'; i++) { if(info->scomment==0) {/*auf Klammerart überprüfen*/ switch (str[i]) { case '{': info->openbracket++; break; case '}': info->openbracket--; break; case '(': info->rcomment++; break; case ')': info->rcomment--; break; case '/': if(str[i+1]=='*') /*schauen ob wir in einem Blockkommentar drin sind*/ { info->scomment=1; str++; /*auf das nächste zeichen zeigen*/ } break; } } if(info->scomment==1 && str[i]=='*') /*schauen ob Blockkommentar zu Ende gegangen ist*/ { if(str[i+1]=='/') { info->scomment=0; str++; } } }
-
Also entweder Array oder Pointerzugriff auf deinen String.
Du hast mal i++ und dann str++
Gemischt macht Probleme.Wegen der for-Schleife ersetz mal die str++ durch i++
Und dasif(info->scomment==1 &&packst du in den else-Zweig vonif(info->scomment==0)
-
leider ist es weiterhin eine endlosschleife

-
ACnut schrieb:
leider ist es weiterhin eine endlosschleife

Wie aeussert sich denn die Endlosschleife? (Was passiert)
Und
fgetsgibt nie einEOFzurueck. (Das sind inkompatible Typen)
fgetsgibt data zurueck, oder im FehlerfallNULL.
-
wertebereichüberschreitungen

schrecklich
es war wirklich das EOFetnweder hab ich mich zu sehr an c++ gewöhnt, oder c ist für mich einfach zu umständlich/bzw. schwieirger zu verstehen (wobei auf hardware ebene, sprich hardwarenahe programmierung, schon interessant ist :))