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: 1
    

    Sowas 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 zu

    this->rechenablauf[0]->push_back(9); // rechenablauf[0] ist kein pointer
    

    das sollte nicht compilieren
    ps: warun this-> , ist zwar ok nur unnötig.
    Kurt

    edit: 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ß ich
    

    zugreifen 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 dachte

    int 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.


Anmelden zum Antworten