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 das if(info->scomment==1 && packst du in den else-Zweig von if(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 ein EOF zurueck. (Das sind inkompatible Typen)
    fgets gibt data zurueck, oder im Fehlerfall NULL .



  • 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 :))


Anmelden zum Antworten