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.