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
fgets
gibt nie einEOF
zurueck. (Das sind inkompatible Typen)
fgets
gibt data zurueck, oder im FehlerfallNULL
.
-
wertebereichüberschreitungen
schrecklich
es war wirklich das EOF
etnweder 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 :))