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 INTDer 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?
-
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