probleme beim kompilieren eines taschenrechners



  • guten morgen.

    ich fang gerade so an mich in c++ reinzufühlen un arbeite gerade mit dem buch "die c++ programiersprache" von bjarne stroustrup. daraus habe ich den taschenrechner aus einer der ersten kapiteln abgetippt. ich benutze nur nen älteren konsolen-compiler von borland, und der meldet einen fehler, der sich aber nicht auf die .cpp datei, sonder auf die .obj bezieht. vielleichtkönnte jemand mir das programm kurz zu kompilieren testen

    wäre sehr dankbar dafür, anfangs muss man immer um seine motivation schauen (:

    taschenrechner.cpp:

    #include <iostream>
    #include <string>
    #include <map>
    #include <cctype>
    
    using namespace std;
    
    map<string,double> table;
    double number_value;
    string string_value;
    
    enum Token_value
    {
    	NAME,	NUMBER,		END,
    	PLUS='+',	MINUS='-',	MUL='*',	DIV='/',
    	PRINT=';',	ASSIGN='=',	LP='(',	RP=')'
    };
    
    Token_value curr_tok = PRINT;
    double term(bool);
    double prim(bool);
    double error(string);
    Token_value get_token();
    
    double expr(bool get)
    {
    	double left = term(get);
    
    	for(;;)
    		switch(curr_tok){
    		case PLUS:
    			left += term(true);
    			break;
    		case MINUS:
    			left -= term(true);
    			break;
    		default:
    			return left;
    		}
    }
    
    double term(bool get)
    {
    	double left = prim(get);
    
    	for(;;)
    		switch(curr_tok){
    		case MUL:
    			left *= prim(true);
    			break;
    		case DIV:
    			if (double d = prim(true)){
    				left /= d;
    				break;
    			}
    			return error("Division durch 0");
    		default:
    			return left;
    		}
    }
    
    double prim(bool get)
    {
    	if (get) get_token();
    	switch (curr_tok){
    	case NUMBER:
    	{	double v = number_value;
    		get_token();
    		return v;
    	}
    	case NAME:
    	{
    		double& v = table[string_value];
    		if (get_token() == ASSIGN) v = expr(true);
    		return v;
    	}
    	case MINUS:
    		return -prim(true);
    	case LP:
    	{	double e = expr(true);
    		if (curr_tok != RP) return error(") erwartet");
    		get_token();
    		return e;
    	}
    	default:
    		return error("primary erwartet");
    	}
    }
    
    Token_value get_token()
    {
    	char ch;
    
    	do {
    		if(!cin.get(ch)) return curr_tok=END;
    	} while (ch!='\n' && isspace(ch));
    	switch (ch) {
    	case ';':
    	case '\n' :
    		return curr_tok=PRINT;
    	case '*':
    	case '/':
    	case '+':
    	case '-':
    	case '(':
    	case ')':
    	case '=':
    		return curr_tok=Token_value(ch);
    	case '0': case '1': case '2': case '3': case '4': 
    	case '5': case '6': case '7': case '8': case '9': 
    	case '.':
    		cin.putback(ch);
    		cin >> number_value;
    		return curr_tok=NUMBER;
    	default:
    		if(isalpha(ch)) {
    			string_value = ch;
    			while (cin.get(ch) && isalnum(ch))                            string_value.push_back(ch);
    			cin.putback(ch);
    			return curr_tok=NAME;
    		}
    		error("Falsches Token");
    		return curr_tok=PRINT;
    	}
    }
    
    int no_of_errors;
    
    double error(const string& s)
    {
    	no_of_errors++;
    	cerr << "Fehler: " << s << "\n\a";
    	return 1;
    }
    
    int main()
    {
    	table["pi"] = 3.1415926535897932385;
    	table["e"] = 2.7182818284590452354;
    
    	while (cin) {
    		get_token();
    		if (curr_tok == END) break;
    		if ( curr_tok == PRINT) continue;
    		cout << expr(false) << '\n';
    	}
    
    	return no_of_errors;
    }
    

    Edit: Codetags 🙄



  • hi, die deklaration von error unterscheidet sich mit dem definitionskopf

    double term(bool);
    double prim(bool);
    double error(const string& );	//hier
    Token_value get_token();
    

    zum zweiten fährst du vielleicht das visual studio 6? das kennt push back nicht in basic_string. entweder zum bleistift den neuen gcc ziehen und verwenden, einen anderen standardkonformen compiler nutzen, oder dir ein work arround dazu schreiben.
    gruß



  • jup. das hab ich übersehen. es war tatsächlich das push_back. vs wird dann wohl mit dem neuen rechner kommen, denn im moment benutze ich noch den 400mhz rechner meiner schwester. nun gut. den code hab ich jetzt soweit verstanden, also kann ich einfach weiterlernen und am neuen rechner dann nochmal rumspielen damit.

    vielen dank



  • Hi,

    string_value.push_back(ch);
    

    kannst du einfach ersetzen durch

    string_value += ch;
    


  • geil, danke...

    ich seh schon, hier wird einem geholfen.


Anmelden zum Antworten