|
You last visited: Today at 16:59
Advertisement
[C++]Error Frage
Discussion on [C++]Error Frage within the C/C++ forum part of the Coders Den category.
06/16/2013, 20:33
|
#1
|
elite*gold: 175
Join Date: Jun 2013
Posts: 157
Received Thanks: 44
|
[C++]Error Frage
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
Code:
#include "stdafx.h"
#include "Funktionen.h"
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <boost\algorithm\string.hpp>
int main()
{
Funktionen f;
while (true)
{
std::vector<std::string> results;
std::string s;
std::cin >> s;
if(s.find('+'))
{
boost::split(results, s, boost::is_any_of("+"), boost::token_compress_on);
std::cout << f.Addieren(atoi(results[0].c_str()), atoi(results[1].c_str())) << std::endl;
}
if (s.find('*'))
{
boost::split(results, s, boost::is_any_of("*"), boost::token_compress_on);
std::cout << results.capacity();
std::cout << f.Multiplizieren(atoi(results[0].c_str()), atoi(results[1].c_str())) << std::endl;
}
}
return 0;
}
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.
Ich bedanke mich schonmal im Vorraus,
'Aleo
|
|
|
06/16/2013, 21:40
|
#2
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Zum einen sollte man std::stoi und nicht atoi benutzen.
Andere Frage:
|
|
|
07/29/2013, 09:37
|
#3
|
elite*gold: 0
Join Date: Mar 2013
Posts: 35
Received Thanks: 5
|
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.
|
|
|
07/29/2013, 18:15
|
#4
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Lexer und Parser schreiben und tada, damit ganz einfach auch komplexe Strings auswerten.
|
|
|
07/29/2013, 20:02
|
#5
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
Wenn schon Boost verwendet wird, kannst du dir auch gleich einen Parser mit  schreiben. Warum einfach, wenn es auch kompliziert geht?
Davon abgesehen lässt sich ein einfacher Parser auch problemlos selbst erstellen:
Code:
#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...
|
|
|
 |
Similar Threads
|
[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 ?
|
All times are GMT +1. The time now is 17:00.
|
|