vector bekommt Wert zugewiesen, ohne dass auf ihn zugegriffen wird
-
Hi,
ich habe ein Problem bei dem ich mir absolut nicht vorstellen kann, wie es überhaupt entsteht.
Das Programm soll im Endeffekt ein Taschenrechner sein.
Am besten ich poste zum besseren Verstaendnis etwas Code:class formel { public: formel(string dieformel); //Konstruktor ~formel(); //Destruktor formel(const formel &rhs); //Kopierkonstruktor double formel_value; private: void zahlenex(string formel); double calc(); vector<int> rechenablauf[1][127]; vector<double> zahlen[127]; };Der Eingabestring bzw. Die 'Aufgabe' für den taschenrechner wird an den Konstruktor als Parameter übergeben, dieser rechnet die Aufgabe aus und speichert das Ergebnis in der Variablen formel_value. Wobei ich zugeben muss, zurzeit bin ich da noch nicht angekommen.
u.a. ruft der Konstruktor auch die Elementfunktion zahlenex() auf, in welcher das Problem liegt.void formel::zahlenex(string formel) { //Code ... this->rechenablauf[0]->push_back(9); this->rechenablauf[1]->push_back(j); //Fehler j++; //Code ... }Normalerweise arbeiten diese 3 Zeilen Code ganz normal, nur wenn im Term eine Variable enthalten ist zeigt sich der Fehler, hier der Code für die Funktion, die den Benutzer nach dem Wert der Variablen fragt.
double var_val(char zeichen) { //verifizieren ob Variable bereits bekannt switch(zeichen) { case 'a': if(set_vars[0]) return vars[0]; break; //b-z, A-Y case 'Z': if(set_vars[25]) return vars[25]; break; default: cerr << "Fehler! var_val(char zeichen) wurde auf ein Zeichen, welches keine Variable ist angesetzt!\n"; break; } //Wenn nicht bekannt, dann abfragen cout << zeichen << "?:\n"; double temp; cin >> temp; switch(zeichen) { case 'a': //b-z, A-Y case 'Z': set_vars[25] = true; vars[25] = temp; break; default: cerr << "Fehler! var_val(char zeichen) wurde auf ein Zeichen, welches keine Variable ist angesetzt!\n"; break; } return temp; }Mein Problem ist, dass Wenn eine Variable im Term enthalten ist, nach der Variable eine Zahl (4.xxxe-310) in den vector zahlen[127] eingefügt wird und zwar in der Zeile in zahlenex() wo //Fehler hintersteht.
Als ich mit dem Debugger noch tiefer gegraben habe, habe ich herausbekommen, dass dieser Wert direkt nach dem ausführen einer ret Anweisung in zahlen[] auftaucht.
Zum besseren verständnis noch eine Ausgabe von meinem Programm:
Term eingeben: 123a+456= a?: 7 Die Zahlen sind: Zahl 1 ist: 123 Zahl 2 ist: 7 Zahl 3 ist: 4.24399e-314 Zahl 4 ist: 456 Die Rechenzeichen sind: Rechenzeichen 1 ist: 10 Rechenzeichen 2 ist: 1Sowas hab ich noch nie gehabt, ich hoffe, dass vielleicht einer von euch mir helfen kann.
Danke im Voraus.P.S.: Compiler: VC++8 Express Beta 2
-
Hm, nimm ein Set für die Variablen, dann kannst du dir den Switch schon mal sparen.
Die zeile myvector[1][n] kann nicht funktionieren, da der vektor nur ein element hat.
Das Tutorial von boost::spirit beschäftigt sich damit, einen einfachen
Formelparser mit spirit zu schreiben, auch wenn das evtl. für dich
noch etwas hoch ist, ist es sicher einen Blick wert:http://boost.org/libs/spirit/index.html
phlox
-
Hab mir den ganzen code gar nicht angesehen aber du definierst
vector<int> rechenablauf[1][127];das ist ein 2 dim array von vektoren
und dann greifst du so darauf zuthis->rechenablauf[0]->push_back(9); // rechenablauf[0] ist kein pointerdas sollte nicht compilieren
ps: warun this-> , ist zwar ok nur unnötig.
Kurtedit: nach etwas nachdenken bin zum schluss gekommen dass das doch ein pointer ist nämlich auf rechenablauf[0][0] daher compiliert es aber es ist wahrscheinlich nicht was du willst. es kracht in der nächsten zeile da rechenablauf in der ersten dimension nur ein element hat und du greifst auf das zweite zu.
-
hmm compiliert alles ganz brav.
Aber wo du mich drauf aufmerksam machst, sehe ich, meinen Fehler. Ich wollte im Endeffekt ein 2D vector haben, aber was ich gemacht habe ist ein 2DArray von 1D vectoren, ziemlich viel Speicher der da umsonst verbraten wird. Und vor allem, ich habe keine Variable Größe die ich ja bei einem Vektor hätte. Allerdings wäre ein 1D Array von 1D vectoren eine Lösung meines Problems (u.U. auch meines großen Problems) , da eine Dimension konstant ist von der Größe her.
Trotzdem ist mir nicht klar, warum im vector zahlen[] was rumgepfuscht wird, ohne das darauf zugegriffen wird. Es kann doch kein Zufall sein, dass dieses Programm immer an eine andere Stelle des Speichers, welche zufälligerweise immer die des letzten Elements von zahlen[] ist immer die gleiche Zahl schreibt. Klingt fast wie ein intelligenter Bug.
Also der Link ist gut, ich werd mir das mal in Ruhe ansehen.
Meinst du mit set den Container?Ich korrigiere erstmal meinen Code und gucke dann ob der Fehler immernoch ist.
Danke auf jeden Fall, dass ihr mich schonmal auf einen anderen Fehler aufmerksam gemacht habt, der hätte nähmlich später Probleme gemacht.P.S.: dass this-> nicht nötig ist weiß ich, macht den Code hier aber meiner Meinung nach verständlicher.
------------------------------------------
So habe jetzt aus
vector<int> rechenablauf[1][127];das gemacht:
vector<int> rechenablauf[1];Der zugriff erfolgt jetzt so:
this->rechenablauf[0].push_back(9);Funktioniert auch, aber mein großes Problem besteht weiter.
-
Ger001 schrieb:
Trotzdem ist mir nicht klar, warum im vector zahlen[] was rumgepfuscht wird, ohne das darauf zugegriffen wird.
Doch ist ganz klar mit
this->rechenablauf[1]->push_back(j);greifts du auf den ersten vector zu der nicht mehr zu rechenablauf gehört ( du greifst auf das zweite element zu und die variable hat nur ein element ). Im speicher liegt das array von vector<double> zahlen gleich dahinter.
rechenablauf[1]->push_back(j) wird also zu zahlen[0].push_back(j);
Kurt
-
Habe ich jetzt richtig verstanden, du willst einen 2D-Vektor?
Dann nimm
std::vector< std::vector<int> > rechenablauf;Damit hast du ein 2D-Vektor, womit du mit
rechenablauf[x][y] = ... //Was weiß ichzugreifen kannst.
Ich hoffe, ich konnte ein bißchen helfen.
-
@BigBoomer die Version kenne ich, damit bin ich oder der compiler nicht klar gekommen, sobald es um den Zugriff über Elementfunktionen ging.
@ZuK
Hast recht, ich hatte da was in falscher Erinnerung. Ich dachteint myArray[10];würde ein Array mit 11 Elementen erzeugen, aber offensichtlich hast du recht, denn nachdem ich
vector<int> rechenablauf[2];stehen habe läufts.
Vielen Dank

War also letztenendes ein einfaches Problem des Syntaxverständnisses.