Objekte verlieren Inhalt



  • Hi,
    ich bin dabei einen Parser zu schreiben. Die Eingabe wird von einem Scanner aufgenommen was auch funktioniert. Der Parser ließt die Tokens vom Scanner, überprüft ob der Syntax korrekt ist und baut einen Parse Baum auf. Beim aufstellen des Baums werden die nötigen Werte die bei der Evaluation gebraucht werden eingetragen, wurde auch im Debugger überprüft. Bei der Evaluation wenn ich die Werte auslesen will sind sie weg.

    ein Beispiel aus dem Parser

    void statement(Node* node){
    		Node* newNode = node->addNode(3);
    		if(firstStatement(tPtr)){
    			if(tPtr->getTType() == typeIdentifier){ // falls erstens zeichen ein Identifier ist
    				newNode->addLeaf(tPtr);
    				if((tPtr = getNextToken())->getTType() == typeOpAsign){ // falls zutrifft identifier := , dann exp()
    					tPtr = getNextToken();
    					exp(newNode);
    				} else { error();} // falls nach ident. nicht := kommt=> fehler	
    				} else if(tPtr->getTType() == typeOpPrint){ // falls statement mit print beginnt...
    					newNode->addLeaf(tPtr);
    					if((tPtr = getNextToken())->getTType() == typeOpOpenBracket){ //... dann muss auch "(" folgen
    						tPtr = getNextToken();
    						// dann nach exp aufloesen..
    						exp(newNode);
    						if(tPtr->getTType() == typeOpClosedBracket){ // auf exp muss ")" folgen
    							tPtr = getNextToken();
    							return;
    						} else { error(); } // falls nicht ")" auf exp folgt => error
    					} else { error(); }// falls auf print keine "(" folgt => error
    			}
    
    		}
    
    	}
    

    Es gibt die Klassen Node und Leaf die von der Klasse ParseTreeElement erben. Hier ein Ausschnitt von node

    class Node : public ParseTreeElement
    {
    
    private:
    	int type; // Typ des Knotens 1 = statementlist  2 = statemenlist2 3 = statement 4 = exp 5 = exp2 6 = op_exp 
    	//7 = explist 8 = explist2 9 = op
    	int elementCount; // Anzahl der Knoten und Blätter die an diesem Knoten hängen
    	static ParseTreeElement** elements; // Knoten und Blätter die an diesem Knoten hängen
    
    public:
    		Node(int nType) //Parameter Typ des Knotens zB statementlist
    		{
    			type = nType;
    			elementCount = 5;
    			elements = new ParseTreeElement*[elementCount];
    			for (int i = 0; i < elementCount; i++)
    			{
    				elements[i] = NULL;
    			}
    		}
    
    Node* addNode(int type)
    		{
    			for (int i = 0; i < elementCount; i++)
    			{
    				if (elements[i] == NULL)
    				{
    					elements[i] = new Node(type);
    					return (Node*)elements[i];
    				}
    			}
    
    			return NULL;
    		}
    

    Wenn ich dann den Baum evaluieren will gibt es eine Speicherzugriffsverletzung. Ich kann auch noch mehr Code posten bei Bedarf.



  • Ich habe schon lange nicht mit Arrays gearbeitet, aber die Zeile

    elements = new ParseTreeElement*[elementCount];

    kommt mir komisch vor - besonders der "*" -> ich denke, der gehört hier nicht hin.

    Außerdem frage ich mich, warum elements ein Pointer-pointer ist - würde nicht auch ein normaler Pointer reichen? Und wenn es ein Pointer-Pointer ist, müsste dann bei der Zeile oben nicht "*elements =" stehen?

    static ParseTreeElement** elements; // Knoten und Blätter die an diesem Knoten hängen

    Wenn ich mich irre, würdest Du somit ein Array mit der falschen Grösse anlegen und dann falsch darauf zugreifen.


Anmelden zum Antworten