Ich habe ein kleines Problem und zwar möchte ich einen Taschenrechner in C++ basteln und es kommt abe rimmer ein Fehler wenn ich 1*3 eintippe, bei 1+3 geht alles. Fehler: debug assertion failed vector subscript out of range Code: Den Klassennamen Funktionen und die Funktionsnamen auch bitte ignorieren war nur ein Versuch für Klassen
Ich habe auch ein anderes Problem undzwar würde ich es auch gerne so machen das wenn man 1 + 2 eingibt die abstände gelöscht werden und erst dann gesplittet wird, jedoch bekomme ich das nicht hin, habe es mit s.erase(boost::remove_if(......)....); versucht es ging aber nicht.
Falls es nicht klappen sollte könntest du ja alternativ mit std::cin eben integer, double etc. einlesen und die Rechenoperation gesondert behandeln mit switch-case. Imho kann man die Geschwindigkeit bei solch kleinen Projekten vernachlässigen.
#include <iostream>
#include <string>
#include <cctype>
template <typename iterator>
int expression (iterator & begin, iterator end);
template <typename iterator>
int term (iterator & begin, iterator end);
template <typename iterator>
int factor (iterator & begin, iterator end);
template <typename iterator>
int number (iterator & begin, iterator end);
int main () {
std::cout << "expression: ";
std::string input;
getline (std::cin, input);
try {
auto begin = input.begin ();
auto end = input.end ();
int value = expression (begin, end);
std::cout << "value: " << value;
if (begin != end)
std::cout << "\ninput not completely parsed";
} catch (const char * exception) {
std::cout << "error: " << exception;
}
std::cout << '\n';
std::cin.get ();
}
template <typename iterator>
int expression (iterator & begin, iterator end) {
int sum = term (begin, end);
while (begin != end)
if (* begin == '+')
sum += term (++begin, end);
else if (* begin == '-')
sum -= term (++begin, end);
else
return sum;
return sum;
}
template <typename iterator>
int term (iterator & begin, iterator end) {
int product = factor (begin, end);
while (begin != end)
if (* begin == '*')
product *= factor (++begin, end);
else if (* begin == '/') {
int denominator = factor (++begin, end);
if (! denominator)
throw "division by zero";
product /= denominator;
} else
return product;
return product;
}
template <typename iterator>
int factor (iterator & begin, iterator end) {
if (begin == end)
throw "unexpected end of input";
if (* begin == '(') {
int value_inside = expression (++begin, end);
if (begin == end || * begin != ')')
throw "missing ')'";
++begin;
return value_inside;
}
return number (begin, end);
}
template <typename iterator>
int number (iterator & begin, iterator end) {
int value = 0;
if (begin == end || ! std::isdigit (* begin))
throw "expected a number";
do {
value *= 10;
value += * begin - '0';
++begin;
} while (begin != end && std::isdigit (* begin));
return value;
}
Korrektheit nicht bewiesen - das Programm stürzte bei zehn zufälligen Eingaben nicht ab, ist also korrekt.
Was die einzelnen Funktionen tun, darf gerne erraten werden.
Die Funktionen könnten in eine eigene Klasse kommen, wie auch der Rückgabetyp parametrisiert werden könnte oder stattdessen ein Syntaxbaum erstellt werden könnte (nach Möglichkeit gleich ein abstrakter). Weiterhin wäre es sinnvoll, noch eine eigene Fehlerklasse erstellen, ebenso das Erstellen eines eigenen Lexers und einer entsprechenden Token-Klasse. Aber dann wiederum wäre die Nutzung von Spirit vielleicht doch nicht verkehrt, sofern man weiß, wie man damit richtig umgeht.
Aber wenn dich dieses Thema interessiert, kannst du dir natürlich das Drachenbuch kaufen, wenn du neben einfacher Syntaxanalyse auch den ganzen Rest eines Compilers kennen lernen möchtest. Oder du suchst einfach im Internet danach...
[Src-Frage]OP Error ? 09/25/2014 - Flyff Private Server - 11 Replies Hey,
ich wüsste gerne, wo in der Source der Error
OP: 13271, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
ausgegeben wird. Hab schon gesucht, aber nichts gefunden.
[KS4 Frage] Was ist das für ein Error? 08/14/2012 - S4 League - 7 Replies Bei mir kam auf einmal so ein komisches Error.
Was hat es damit auf sich, es kommt immer, wenn ich START drücke(im IE9)
http://epvpimg.com/BbKbb
error frage 07/27/2011 - Combat Arms - 1 Replies hey! immer wenn ich jemanden in meinen clan einladen will(bin leader),kommt so ein error: you are already waitig for approvenel of another clan. oder so ähnlich. kann mir jemand sagen wie ich das problem beheben kann? vorgestern wars noch nicht da
[Frage] GPS Error 04/01/2011 - Metin2 Private Server - 0 Replies Hi, I would ask what I do when I am on a pergamen back into place, will place the name of the map - GPS error?
[Frage] Error 08/03/2010 - CrossFire - 7 Replies Mein Problem ist dieses Error.
http://www4.pic-upload.de/02.08.10/6686emgo33s.jp g
Ich habe MM Port gespielt und hatte gerade 61 zu 5 oder so. Dann macht mich einer zum Mutant und ich bekomme das Error und fliege in die Lobby. Dannach bin ich wieder gejoin wurde wieder Mutant und der Error kam wieder.
Weiß einer was dazu ?