Zyklische Includes



  • Hi, bin neu hier und bräuchte etwas Hilfe bei einem Projekt.

    Genauer gesagt habe ich zwei Strukturen, bei denen das folgende Problem auftritt:

    //structA.h
    #include "structB.h"
    struct A
    {
      int xy;
      //....
      std::list<B*> bListe;
    };
    
    //structB.h
    #include "structA.h"
    struct B
    {
      //...
      A aObjekt;
    };
    

    In dieser Form kann das nicht funktionieren, da in den Includes ein Zyklus entsteht. Allerdings habe ich noch keine Möglichkeit gefunden, wie ich so eine Abhängigkeit umgesetzt bekomme.
    Ich habe auch schon versucht statt den expliziten Pointern void-zeigerzu verwenden, aber das Rück-Casting funktioniert dann nicht mehr, so dass ich keine
    benötigten Funktionen mehr verwenden kann.

    Ich freue mich auf eure Hilfe.

    MfG

    DiZZ



  • Stichwort Foward-Deklaration.

    Bei Pointern reicht es aus, wenn der Typ bekannt gemacht wird:

    //structA.h
    struct B;
    
    struct A
    {
      int xy;
      //....
      std::list<B*> bListe;
    };
    
    //structB.h
    #include "structA.h"
    struct B
    {
      //...
      A aObjekt;
    };
    


  • Hey,

    danke für die schnelle Antwort, aber leider bekomme ich keine korrekten Werte, wenn
    ich später funktionen aus B aufrufen will.
    Das sieht dann nach zufälligen Werten aus dem Speicher aus.
    Alle Variablen aus der Struktur haben nur noch sinnlosen inhalt.



  • Mehr Code 🙂 ...



  • Hm ok mal schauen - ich such mal raus was geht...

    //particle.h
    #include <vector>
    #include <math.h>
    #include "vector.h"
    #include "spring.h"
    
    //...
    
    struct Particle {
      DclVector  position;
      DclVector  velocity;
      DclVector  force;
      double  mass;
    
      //...
    
      //...
    
      std::vector<spring*> springs;
    };
    
    extern std::vector<Particle> vectorParticles;
    
    //spring.h
    #ifndef SPRING_H
    #define SPRING_H
    
    struct Particle;
    
    struct spring
    {
    	double springConstant;
    	double initLength;
    	double currLength;
    
    	Particle* mp0;
    	Particle* mp1;
    
    	//...
    
    	spring(Particle* m0, Particle* m1, double spCon, double length)
    	{
    		springConstant = spCon;
    		initLength = currLength = length;
    		mp0 = m0;
    		mp1 = m1;
    	}
    
    	Particle* getPartner(Particle* self)
    	{
    		return self==mp0 ? mp1 : mp0;
    	}
    };
    
    #endif
    
    //Simulation.cpp
    
    //....
    
    void addSpring(Particle& p1, Particle& p2, double spConst = 1.0)
    {
    	spring* s = new spring(&p1, &p2, spConst, (p1.position - p2.position).length());
    	p1.springs.push_back(s);
    	p2.springs.push_back(s);
    }
    
    //...
    
    void makeCube(double x, double y, double z, double size)
    {
    	Particle particle[27];
    
            //...
    
    	for(int i = 0; i < 27; i++)
    	{
    		if(i%3 == 0)
    		{
    			addSpring(particle[i], particle[i+1]);
    			addSpring(particle[i+1], particle[i+2]);
    		}
    		if(i < 9)
    		{
    			addSpring(particle[i], particle[i+9]);
    			addSpring(particle[i+9], particle[i+18]);
    		}
    		if(i%9 == 0 || i%9 == 1 || i%9 == 2)
    		{
    			addSpring(particle[i], particle[i+3]);
    			addSpring(particle[i+3], particle[i+6]);
    		}
    	}
    
    	for(int i = 0; i < 27; i++)
    	{
    		particle[i].force.clear();
    		particle[i].mass = 1.0;
    		particle[i].integration = EulerCromer;
    		particle[i].r = particle[i].g = particle[i].b = 1.0;
    		vectorParticles.push_back(particle[i]);
    	}
    }
    
    //....
    
    void  addForces(Particle& particle)
    {
    	DclVector spring;
      particle.force += DclVector(0, 1.0, 0) * particle.mass * -9.81; // gravitational force
      for (int sp = 0; sp < particle.springs.size(); sp ++)
      {
    //////////////////////////////////////////////////////////////////
    // Hier gibts probs zur runtime
    
    	spring = particle.position - (particle.springs[sp]->getPartner(&particle))->position;  
    
    //////////////////////////////////////////////////////////////////
    
    	spring.normalize();
    	particle.force += spring*((particle.springs[sp]->initLength - particle.springs[sp]->currLength)*particle.springs[sp]->springConstant);
      }
    }
    
    //...
    

    ^^so das ist mal nen größerer Ausschnitt. Vielleicht habe ich ja auch nur einen anderen kleinen Fehler gemacht. *hoff* 😉

    Das Projekt ist leider schon sehr groß - ich hoffe ich hab nichts wichtiges vergessen.



  • Bitte nur den relevanten Code und den Code posten wodurch der Fehler verursacht wird, damit wir das genau nachvollziehen können. Aber vllt hat ja einer Lust und schaut sich das an 🙂



  • ^^jaja erst mehr code wollen und dann keine Lust mehr 😛
    ich denke das meiste davon ist schon relevant - ausser man kürzt das so wie ich es am Anfang gemacht habe - bin nur der Aufforderung nachgekommen...

    Also wer keine Lust hat - ich freu mich auch sehr über antworten zum ersten Post 😉



  • Sind deine Partikel denn initialisiert?

    Du erzeugst das Array der Partikel (Standardkonstruktor vorhanden?) und arbeitest gleich damit los, zumindest in dem Codeschnipsel.



  • Desweiteren halte ich die Speicherung der Pointer mp0 und mp1 in der Klasse für recht riskant. Du kannst innerhalb der Klasse nicht erkennen, ob diese Pointer auf gültigen Speicher zeigen.


Anmelden zum Antworten