Problem mit Globalen Pointer



  • isOnScreen gibt einfach nur die Variable onScreen der Instanz aus. Da wird auch nichts verändert. Das Problem ist, dass die Methode isOnScreen() und sämtliche anderen Methoden, die auf dC_ptr angewandt werden, nur innerhalb des Blocks funktioniert, in dem dC_ptr gesetzt wird. Verwende ich dC_ptr in einer anderen Methode, geben mir sämtliche Methoden, die auf dC_ptr angewandt werden, nur blödsinn zurück. Ich hab auch schon geguckt, ob evtl eine falsche Adresse in dC_ptr steht, aber die ist immer == die Adresse die in this steht.

    Beim 2. Kommentar wird cout << "yoooOO"; ausgeben, obwohl die variable onScreen false ist. Beim Ausgaben des Ergebnisses von isOnScreen() bekomme ich dann eine 172 und nicht "false".


  • Mod

    Cuze schrieb:

    isOnScreen gibt einfach nur die Variable onScreen der Instanz aus. Da wird auch nichts verändert. Das Problem ist, dass die Methode isOnScreen() und sämtliche anderen Methoden, die auf dC_ptr angewandt werden, nur innerhalb des Blocks funktioniert, in dem dC_ptr gesetzt wird. Verwende ich dC_ptr in einer anderen Methode, geben mir sämtliche Methoden, die auf dC_ptr angewandt werden, nur blödsinn zurück. Ich hab auch schon geguckt, ob evtl eine falsche Adresse in dC_ptr steht, aber die ist immer == die Adresse die in this steht.

    Da kann so allerhand schiefgehen, die üblichen Probleme mit globalen Variablen: Existiert das Objekt überhaupt noch? Wurde der Pointer auch tatsächlich vorher gesetzt? Wird er eventuell durch eine lokale Variable verdeckt? Wurde eventuell zwischendurch der Wert anderswo geändert? Wie genau definierst du Blödsinn? Hast du das Programm mal mit voll aufgedrehten Warnungen compiliert? Mal so etwas wie valgrind benutzt? Kannst du das Programm soweit zusammen kürzen, dass wir hier den Fehler selber nachvollziehen können?

    Beim 2. Kommentar wird cout << "yoooOO"; ausgeben, obwohl die variable onScreen false ist. Beim Ausgaben des Ergebnisses von isOnScreen() bekomme ich dann eine 172 und nicht "false".

    Ist isOnScreen kein bool?



  • Hier nochmal bisschen was zur klasse

    DEKLARATION

    class detectionCone
    {
    
    	GeomSceneGraph* sceneGraph;
    	PhysicsManager* physicManager;
    	RigidBody* rb;
    	RigidBody* rbC;
    
    	DynamicVolume box;
    	btConvexHullShape* btC;
    
    	GeoPositionsPtr points;
    
    	GeometryPtr geo;
    	GeometryPtr snapGeo;
    	SimpleMaterialPtr material;
    	TwoSidedLightingChunkPtr twosided;
    	GeoPTypesPtr type;
    	GeoPLengthsPtr lens;
    
    	NodePtr gPtr;
    	NodePtr snapPtr;
    	NodePtr modelRoot;
    
    	TimeManager timeManager;
    	double interval;
    	double actual;
    	bool onScreen;
    
    public:
    
    	detectionCone(){};
    	detectionCone(GeomSceneGraph* sg, PhysicsManager* ps);
    	~detectionCone(){};
    
    	void createCone(RigidBody* rb, TransformPtr cameraTrans);
    	void createRigidBodyCone();
    	void registerFunction();
    	void updateVertices(TransformPtr cameraTrans);
    	void updateRigidBodyCone();
    	void removeRigidBodyCone();
    	RigidBody* returnRigidBodyCone();
    	RigidBody* returnRigidBody();
    	NodePtr returnGeometryNodePtr();
    	GeoPositions3fPtr computeVertices(TransformPtr cameraTrans);
    
    	bool isOnScreen();
    	void makeSnapShot();
    
    	static void threadCallBack(float f);
    };
    

    und hier die relevanten Definitionen. createCone wird direkt nach dem Konstruktor aufgerufen.

    #include "detectionCone.h"
    
    detectionCone* dC_ptr;
    
    detectionCone::detectionCone(GeomSceneGraph* sg, PhysicsManager* ps)
    {
    	dC_ptr = this;
    	onScreen = false;
    
    	//hier werden die couts nicht durchgeführt
    	if(dC_ptr->isOnScreen())
    	{
    		cout << "CHECK";
    	}
    	if(this->isOnScreen())
    	{
    		cout << "CHECK_DC";
    	}
    }
    
    void detectionCone::createCone(RigidBody* rb, TransformPtr cameraTrans)
    {
    	this->rb = rb;
    	points = computeVertices(cameraTrans);
    
            //Rückgabewert habe ich mal ausgelesen: Er ist 172. If-Bedingung
            //nimmt true an und gibt das cout aus.
            if(dC->isOnScreen())
            {
                 cout << "Ich darf nicht ausgegeben werden
    }
    


  • Ah verdammt

    da fehlt code:

    if(dC_ptr->isOnScreen()
    {
       cout << "Ich darf nicht ausgegeben werden";
    }
    


  • SeppJ schrieb:

    Cuze schrieb:

    isOnScreen gibt einfach nur die Variable onScreen der Instanz aus. Da wird auch nichts verändert. Das Problem ist, dass die Methode isOnScreen() und sämtliche anderen Methoden, die auf dC_ptr angewandt werden, nur innerhalb des Blocks funktioniert, in dem dC_ptr gesetzt wird. Verwende ich dC_ptr in einer anderen Methode, geben mir sämtliche Methoden, die auf dC_ptr angewandt werden, nur blödsinn zurück. Ich hab auch schon geguckt, ob evtl eine falsche Adresse in dC_ptr steht, aber die ist immer == die Adresse die in this steht.

    Da kann so allerhand schiefgehen, die üblichen Probleme mit globalen Variablen: Existiert das Objekt überhaupt noch? Wurde der Pointer auch tatsächlich vorher gesetzt? Wird er eventuell durch eine lokale Variable verdeckt? Wurde eventuell zwischendurch der Wert anderswo geändert? Wie genau definierst du Blödsinn? Hast du das Programm mal mit voll aufgedrehten Warnungen compiliert? Mal so etwas wie valgrind benutzt? Kannst du das Programm soweit zusammen kürzen, dass wir hier den Fehler selber nachvollziehen können?

    Beim 2. Kommentar wird cout << "yoooOO"; ausgeben, obwohl die variable onScreen false ist. Beim Ausgaben des Ergebnisses von isOnScreen() bekomme ich dann eine 172 und nicht "false".

    Ist isOnScreen kein bool?

    Objekt existiert noch, der Pointer wird definitiv vorher gesetzt, eine lokale Variable gibts nicht. Die Instanz wird nur einmal erzeugt und der dC_ptr auch nur im Konstruktor gesetzt.
    Wie kann ich die Warnungen denn hochdrehen? Valgrind hab ich noch nicht benutzt.



  • Ich habe jetzt herausgefunden was schief geht. Allerdings verstehe ich den Sinn überhaupt nicht.

    Im Konstruktor hat der this pointer eine falsche Adresse. dC_ptr wird damit belegt und ist dann in den Methoden Aufrufen nicht mehr korrekt. Der this pointer besitzt nämlich in den Methoden der Klasse die richtige Adresse!

    Warum ist das so?


  • Mod

    Klingt so, als würdest du unabsichtliche Kopien machen. Schreib doch mal dein createClone zu einem Zuweisungsoperator und einem Kopierkonstruktor um, wie es sich gehört. Oder verbiete Kopien, indem du diese beiden Methoden private machst, dann schmeißt dir der Compiler einen Fehler in der Zeile, wo du die Kopie machst.



  • die methode ist createCone. Cone für Kegel 🙂 Das ist kein Kopieren


  • Mod

    Cuze schrieb:

    die methode ist createCone. Cone für Kegel 🙂 Das ist kein Kopieren

    Ups. Ändert aber nichts da dran, dass dies verdächtig nach einer versteckten Kopie klingt. Du erzeugst ein Objekt, setzt dC_ptr, kopierst das Objekt, setzt dC_ptr nicht neu, altes Objekt wird zerstört, Zugriff auf ungültigen Pointer ➡ Chaos.



  • Jedenfalls ist mein Problem gelöst. Danke für die Hilfe


Anmelden zum Antworten