Zeiger-Parameter zeigt nach Methodenaufruf wieder auf Null



  • Hallihallo,

    ich habe nicht wirklich großartig C++ gelernt. Nur musste ich aufgrund eines Projektes in meinem Studium direkt ins kalte Wasser springen. Ich habe die nötigen Grundkenntnisse nur ein Problem plagt mich schon die ganze Woche.
    Da Java bisher meine Sprache war habe ich auch für C++ die Eclipse-IDE genutzt und dort klappt es jetzt auch mit dem Debug per gdb. Als Compiler verwende ich dementspechend gcc. Aber nun zum genauen Problem:

    Ich habe eine Methode die mir einen Double Wert ausgibt. Zusätzlich will ich aber noch ein Objekt dem der Double-Wert zugrunde liegt speichern. Also übergebe ich im Methodenaufruf einen Zeiger der dann in der Methode auf das benötigte Object zeigt.

    [cpp]double BVTree::traverse(AHVector3D& pos, AHVector3D& ray, BoundingBox* node, AHObject* hitObject) {
    	stack<BoundingBox *> nodeStack;
    	nodeStack.push(node);
    	double t = LONG_MAX;
    
    	while(!nodeStack.empty()) {
    		node = nodeStack.top();
    		nodeStack.pop();
    
    		while(!node->isLeaf()) {
    			if(node->intersect(pos, ray)) {
    				nodeStack.push(node->getLeftChild());
    				node = node->getRightChild();
    			} else {
    				break;
    			}
    		}
    
    		if(node->isLeaf()) {
    			double dist;
    			dist = node->getObject()->Intersect(pos, ray);
    			if(dist > 0 && dist < t) {
    				t = dist;
    				[b]hitObject = node->getObject();[/b]
    			}
    		}
    	}
    	return t;
    }
    [/cpp]
    

    Ich habe die Problemstelle mal fett markiert. Genau hier wird der Pointer eigentlich auf das Objekt gesetzt. Das tut er auch laut Debugger. Aber sobald er aus der Methode raus geht. Ist der Wert wieder auf Null gesetzt. So als ob es sich um eine lokale Variable der Methode handeln würde. Aber das ist doch bei einem Pointer doch nicht möglich, oder etwa doch?

    Hier noch einmal der Code-Abschnitt in der ich die Methode aufrufe. Wie gesagt, in der Methode ist die Adresse noch gesetzt, nachdem Methodenaufruf nicht mehr.

    [cpp]  AHObject* anObjectHit = NULL;
    
      s = FAR_AWAY;
    
      BoundingBox* hitBB = bvh->getRoot();
    
      s = bvh->traverse(pos, ray, hitBB, anObjectHit);
    
      /* we got still no object? then we stop here */
      if(anObjectHit == NULL) {
    	  return(0);
      }
    [/cpp]
    

    Ich hoffe es kann mir jemand weiterhelfen. Vielen Dank schonmal.

    MfG
    Cid



  • Evtl solltest du versuchen, eine Referenz auf einen Pointer zu übergeben - dann klappt das vrmtl auch ^^

    bb



  • Doof gefragt. Wie referenziere ich denn auf einen Pointer?



  • Cid schrieb:

    So als ob es sich um eine lokale Variable der Methode handeln würde. Aber das ist doch bei einem Pointer doch nicht möglich, oder etwa doch?

    Doch. Zeiger verhalten sich als Objekt gleich wie z.B. int oder std::string . Wenn du einen Zeiger an eine Funktion übergibst, wird dieser kopiert. Das heisst, der Zeiger innerhalb der Funktion ist nicht mehr der gleiche.

    Aus diesem Grund musst du wie unskilled schon sagte eine Referenz oder einen Zeiger auf deinen Zeiger an die Funktion übergeben. Hier ein Beispiel mit der Referenz:

    AHObject*& hitObject
    


  • Ok, danke für die Info. Jetzt hab ich das soweit ergänzt. Aber der Pointer ist daraufhin immer noch null. Gibt es noch irgendwas bei der Übergabe des Parameters bzw. bei der Zuweisung zu beachten?



  • Cid schrieb:

    Gibt es noch irgendwas bei der Übergabe des Parameters bzw. bei der Zuweisung zu beachten?

    Nein



  • ok, entschuldigt. Wenn er auch nicht neu kompiliert, kann ers auch nicht übernehmen. *schon spät für mich*

    Jetzt funktioniert alles wie es soll. Danke nochmal an euch Beiden.


Anmelden zum Antworten