std::string haengt...
-
Tach,
Ich habe eine lib/modul/classe (wie man das auch nennt) geschrieben,
welche mit Buchstaben rechnen kann... (was man halt so schreibt,
wenn man etwas zeit hat)
Jetzt will ich natuerlich das resultat ausgeben lassen... mit einer
function:std::string algebrabc::str_out(void){ std::vector<std::string>::iterator itstr; std::string endstr; if(!oben.empty()){ for(itstr=oben.begin(); itstr!=oben.end(); ++itstr){ std::cout<<(*itstr)<<std::endl; endstr+=(*itstr); } } if(is_bruch and !unten.empty()){ endstr+='/'; for(itstr=unten.begin(); itstr!=unten.end(); ++itstr){ std::cout<<(*itstr)<<std::endl; //PERSER endstr+=(*itstr); } } if(endstr.empty()) endstr+='0'; return endstr; } std::string algebrabc::str_out(char b){ std::vector<std::string>::iterator itstr; std::string endstr; if(!oben.empty() and b=='o'){ for(itstr=oben.begin(); itstr!=oben.end(); ++itstr){ endstr+=(*itstr); } } if(is_bruch and !unten.empty() and b=='u'){ for(itstr=unten.begin(); itstr!=unten.end(); ++itstr){ endstr+=(*itstr); } } if(endstr.empty()) endstr+='0'; return endstr; }
Es list dies aus einem vector aus:
std::vector<std::string> oben, unten; //nur das man sichs vorstellen //kann.
sobald der ausgabe string zu lang ist, haengt das Programm am ende.
Mein Perser Progie:#include "algebrabc/algebrabc.h" #include <iostream> #include <string> int main(){ std::string str; algebrabc mal1,mal2; std::cout<<"Eingabe: "; str.clear(); std::cin>>str; mal1.insert(str); std::cout<<"mal: "; str.clear(); std::cin>>str; mal2.insert(str); if(mal1+mal2) std::cout<<"+ ist okey"<<std::endl; //std::cout<<"AUSGABE: "<<mal1.str_out('o')<<std::endl; std::cout<<"AUSGABE: "<<mal1.str_out('u')<<std::endl; //std::cout<<"AUSGABE: "<<mal1.str_out()<<std::endl; std::cout<<"End Of Classe"<<std::endl; return 1; }
Das Prog heist AlgebrABC...
Wenn es sich erhaengt:
-bash-3.0$ c++ sva.cpp -bash-3.0$ -bash-3.0$ ./a.out Eingabe: 34a+6e/8h+9k mal: 2w+9i/7j+3la + ist okey AUSGABE: +238aj+42ej+102a^2l+18ael+16hw+72hi+18kw+81ik End Of Classe
Es bleibt einfach haengen und fuelt die RAM...
Das resultat des Perser Prog stimmt daher nicht, weil ich nur einige teile ausgelesen habe
Hat jemand eine Idee?Kann mir jemand noch ne Lib die Auch solche Algebra strings zusammen zaehlen und rechen kann, koennte mir dann vieleicht noch eine idee abschauen...
MFG Ghost
/////////////EDIT/////////////////
-
mein Perser prog ist schnell geschrieben und schlechter code...
Also weg schauen -
Im vector string ist:
+23w
-3e
+4e^3d
Je nach dem was es gerechnet hat
Es geht in der ausgabe nur darum es zu einem string zusammen zu fassen.
-
-
Kann mir jemand nicht einen Tip geben,
wie ich ein std::vectorstd::string in einen std::string zusammen fasen kann?
Vieleicht muss ich es ja nur anders machen...
-
Benutz den Debugger, damit kannst du sehen, was dein Programm da treibt. Ich würde aber erst mal auf den Destruktor tippen. Übrigens, ich vermute, du meinst "Parser". Perser ist etwas anderes.
-
Mit Parser meinte ich, das ich das resultat Abfangen kann...
Darum ist es auch ein pool der gefuehleHab die ganze Nacht kaum geschlafen, und bin auch auf den Destructor gekommen.
Versuche es gleich mal, danke
-
Es war der Destructor....
Hat jamand ne idee was daran falsch ist?algebrabc::~algebrabc(void){ (*algstr).clear(); (*algstrN).clear(); delete algstr; delete algstrN; delete zahl; delete zahlN; oben.clear(); unten.clear(); it=0; is_bruch=false; is_face=false; }
Hat mir jemand einen link, wie man debuggert?
-
Green_Ghost schrieb:
algebrabc::~algebrabc(void){ (*algstr).clear(); //nicht nötig wegen delete, delete ruft Destruktor von algstr auf (*algstrN).clear(); //dito delete algstr; delete algstrN; delete zahl; delete zahlN; oben.clear(); //nicht nötig, Destruktor von oben/unten wird automatisch beim zerstören der Instanz von algebrabc aufgerufen unten.clear(); //dito it=0; //??? is_bruch=false; //??? is_face=false; //??? }
Ein Destruktor dient dazu eine Instanz einer Klasse zu zerstören. Hier sind Zuweisungen also sinnlos.
-
Danke viel mal...
Hier lernt man
-
Green_Ghost schrieb:
Hat jamand ne idee was daran falsch ist?
Am Destruktor selbst zunächst mal nichts dramatisches. Aber sind die Zeiger, mit denen du da delete aufrufst, auch sicher welche, die du zuvor durch new erhalten hast? Oder weist du diesen Zeigern irgendwo andere Werte zu?
Hat mir jemand einen link, wie man debuggert?
Das kommt darauf an, welchen Debugger du hast.
-
algebrabc::algebrabc(void){ algstr = new std::map<std::string, int>; algstrN = new std::map<std::string, int>; zahl = new long double; zahlN = new long double; is_bruch=false; is_face=false; oben.clear(); unten.clear(); }
Wird alles schoen zugewiesen... (sollte zumindest)
-
oben.clear(); und unten.clear(); kannst du getrost weglassen. Bei der Kontruktion von oben und unten, sind die Container sowieso leer. Desweiteren könntest du auch Gebrauch von der Initialisierungsliste machen.
algebrabc::algebrabc(void) :algstr(new std::map<std::string, int>), ... { ... }
-
Green_Ghost schrieb:
algebrabc::algebrabc(void){ algstr = new std::map<std::string, int>; algstrN = new std::map<std::string, int>; zahl = new long double; zahlN = new long double; is_bruch=false; is_face=false; oben.clear(); unten.clear(); }
Wenn du sowieso im Konstruktor new und im Destruktor delete aufrufst, warum sind algstr, algstrN, zahl und zahlN dann überhaupt Zeiger?