Segmentation fault bzw. Endlosrekursion



  • Hallo liebes Forum 🙂

    Ich habe mir zu Aufgabe gestellt eine primitive Grammatik zum Parsen mathematischer Terme zu programmieren. Leider verliert sich mein Code in einer Endlosrekursion.

    double getAusdruck(std::vector<std::string> exp)
    {
    	double zwierg;
    	double erg;
    	std::vector<std::string> zwexp;
    	std::vector<std::string> ausdruck;
    	int i = 0;
    	for(i; i < exp.size() && i != -1; i++)
    	{
    		if(exp[i] == "+")
    		{
    			zwierg = getTerm(ausdruck);
    			for(int j = i+1; j < exp.size(); j++)
    			{
    				zwexp.push_back(exp[j]);
    			}
    			i = -1;
    			erg = zwierg + getAusdruck(zwexp);
    		}
    		else if(exp[i] == "-")
    		{
    			zwierg = getTerm(ausdruck);
    			for(int j = i+1; j < exp.size(); j++)
    			{
    				zwexp.push_back(exp[j]);
    			}
    			i = -1;
    			erg = zwierg - getAusdruck(zwexp);
    		}
    		else
    		{
    			ausdruck.push_back(exp[i]);
    		}
    	}
    	if(i >= exp.size())
    	{
    		erg = getTerm(ausdruck);
    	}
    	return erg;
    }
    

    Ich übergebe der Funktion einen vector<string> in folgender Form:
    Glied 0 -> "2"
    Glied 1 -> "+"
    Glied 2 -> "2"

    Nun müsste ich eigentlich immer 0 zurückgegeben bekommen, weil getTerm() nur 0 zurückgeben kann. Dies funktioniert allerdings nicht wenn ein "+" oder "-" im vector liegt, denn dann entsteht die Endlosrekursion.

    Leider bin ich mit meinem Latein am Ende und wende mich nun an euch.

    MfG luggas



  • Ich finde erstmal das hier "unpassend":

    i < exp.size()
    

    i ist ein INT
    exp.size() ist ein UNSIGNED INT

    Der Vergleich müsste bei dir mindestens eine Warnung geben.

    Wenn du unbedingt aus der for-Schleife rauswillst, verwende doch "break" anstatt der Prüfung auf "i == -1".

    Das wird vermutlich dein Problem nicht lösen, aber ist erstmal ein Anfang.



  • Danke das wars. Ich glaub es nicht es lag daran das int und unsigned int nicht harmonieren. Wahrscheinlich weil ich i auf -1 gesetzt hab. Der compiler hatte aber nix gesagt, das ist ganzschön krass. 😃



  • Lässt du dir auch Warnungen anzeigen?



  • denke schon ich benutze g++ auf ubuntu server oder muss man da noch nen parameter setzen?


  • Mod

    luggas schrieb:

    denke schon ich benutze g++ auf ubuntu server oder muss man da noch nen parameter setzen?

    Benutz mindestens "-Wall". Wenn du magst sogar noch dazu "-Wextra" und "-pedantic".



  • luggas schrieb:

    denke schon ich benutze g++ auf ubuntu server oder muss man da noch nen parameter setzen?

    Flags musst du setzen. Ich hab z.B. folgende gesetzt: -march=native -O2 -Wall -Wextra -pedantic -Wswitch-default -Wfloat-equal -std=c++0x -std=gnu++0x -Wc++0x-compat



  • danke jetzt bekomme ich warnungen nice


Anmelden zum Antworten