Rechner rechnet nach z.b. "sin" nicht weiter...



  • so ungern wie ich es auch tue.. ich muss einfach nochmal was fragen.. undzwar komme ich mit einem problem gerade echt nicht weiter..
    ich weis dass der code echt schlampig programmiert wurde.. werde es aber nicht mehr ändern.. nicht diesen.. ich habe versprochen ich werde mir ein paar bücher zu herzen nehmen.. geht nur leider momentan zeitlich nicht..

    nur hier mein problem:

    der code rechnet ganz gut umd ganz schön.. nur wenn ich z.b.: "sin(2)+2" rechnen will, geht dass nicht.. er rechnet immer nur sin(2) und gibt dann dass aus..
    andersrum geht aber "2+sin(2)".. also er macht alles bis er zum ersten trigonometrischem problem kommt.. rechnet dies und ignoriert dann alles danach...

    kurz was zum verständniss.. sinus, cosinus und tangens werden noch mit s,c und t abgekürzt.. also einfach s(2) statt sin(2).

    und ja.. hier der momentane code.. :

    double Calculator::num()
    {		
    
    	char *endptr;
    	double a, x, y, z;
    
    	if(buffer[position] == 'p'){
    	 return a = 3.14159265;
    	  position++;
    	}
    
    	else if(buffer[position] == 's')
    	{
    
    		position++;
    		if(buffer[position] != '(')
    			error();
    		position++;
    
    		if(buffer[position] == 'p'){
    			x = 3.1415926359;
    		  position++;
    		}
    		else
    		{
    
    			 x = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
    			 unsigned len = (unsigned) (endptr - &buffer[position]);
    
    			if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    			error();
    			position += len;
    		}
    
    		if(buffer[position] == ')'){
    
    			 a = sin(x);
    			position++;
    		}
    
    		else position++;
    
    			if(buffer[position] == 'p'){
    			  y = 3.1415926359;
    			  position++;
    			}
    			else
    			{
    
    			  y = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
    			  unsigned len = (unsigned) (endptr - &buffer[position]);
    
    				if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    					error();
    				position += len;
    			}
    
    			return a = sin(x*y);
    	}
    
    	else if(buffer[position] == 'c')
    	{
    
    		position++;
    		if(buffer[position] != '(')
    			error();
    		position++;
    
    		if(buffer[position] == 'p'){
    		  x = 3.1415926359;
    		  position++;
    		}
    		else
    		{
    
    			 x = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
    			 unsigned len = (unsigned) (endptr - &buffer[position]);
    
    			if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    			error();
    			position += len;
    		}
    
    		if(buffer[position] == ')'){
    			 return a = cos(x);
    			position++;
    		}
    
    		else position++;
    
    			if(buffer[position] == 'p'){
    			  y = 3.1415926359;
    			  position++;
    			}
    			else
    			{
    
    			  y = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
    			  unsigned len = (unsigned) (endptr - &buffer[position]);
    
    				if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    					error();
    				position += len;
    			}
    			 return a = cos(x*y);
    	}
    
    	else if(buffer[position] == 't')
    	{
    		position++;
    		if(buffer[position] != '(')
    			error();
    		position++;
    
    		if(buffer[position] == 'p'){
    		  x = 3.1415926359;
    		  position++;
    		}
    		else
    		{
    
    			 x = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
    			 unsigned len = (unsigned) (endptr - &buffer[position]);
    
    			if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    			error();
    			position += len;
    		}
    
    		if(buffer[position] == ')'){
    			return a = tan(x);
    			position++;
    		}
    
    		else position++;
    
    			if(buffer[position] == 'p'){
    			  y = 3.1415926359;
    			  position++;
    			}
    			else
    			{
    
    			  y = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
    			  unsigned len = (unsigned) (endptr - &buffer[position]);
    
    				if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    					error();
    				position += len;
    			}
    			return a = tan(x*y);
    
    	}
    
    	else
    	{
    
            a = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
            unsigned len = (unsigned) (endptr - &buffer[position]);
    
    		if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
    		error();
    		position += len;
    
    	}
    	return a;
    }
    

    nunja.. kann mir jemand sagen woran dass liegen kann??

    also die funktion num() scheint da was nicht ganz richtig zurückzugeben (?)..
    bitte um hilfe...



  • Hi,
    zu viel Code. Ich denke, das schaut sich keiner an. Wenn man beim Code scrollen muss, wirds oft kritisch. Du musst dein Code aufs wesentliche reduzieren. Vielleicht findest du dabei sogar deinen Fehler. Ansonsten, hast dus schon mit dem Debugger versucht?



  • Poste mal die Stelle, wo du das + Zeichen in der Eingabe erkennst.



  • Das dürfte kein großes Problem sein. Überprüfe die Variable len nach der sin Anweisung. Das riecht nach Buffer Overflow, Integer Overflow wg. falschem Aligment (Big Endian...). Alles Dinge welche in richtigem C++ nicht mehr vorkommen sollten.



  • Ramanujan schrieb:

    Poste mal die Stelle, wo du das + Zeichen in der Eingabe erkennst.

    double Calculator::list()
    {
     double a = expr(), b;
     if(buffer[position] == '+') {
    	 position++;
       b = list();
       return a + b;
      }
     else if(buffer[position] == '-') {
    	 position++;
       b = list();
       return a - b;
     }
     else if(buffer[position] && buffer[position] != ')')
    //      Lookhead ist eine schließende Klammer.
    //      Falls der Zähler klammern Null ist liegt ein Syntaxfehler vor.
     if(!klammern)
      error();
     else
      error();
    	return a;
    }
    

    edit: ok das problem war, dass ich counter++ erst nach dem return hatte.. habs geändert und jetzt gehts... probleme habe ich jetzt bei dem hier:

    sin(1)+cos(3)*tan(4)-arcsin(1)-arccos(0)/arctan(1)

    da rechnet er nur bis zum tan.. (ja ich habe um die umkehrfunktionen erweitert.. nach dem gleichem schema



  • Überleg mal, welchen Sinn

    if(buffer[position] == ')'){
        return a = cos(x);
        position++;
    }
    

    macht (bezogen auf die Reihenfolge der Anweisungen)...


Log in to reply