Pointer: Vergleichen und Manipulieren (um Nachbarshaften festzustellen)
-
Hallo,
ich hoffe ich kann mein Problem hier verstaendlich darstellen:
Ich habe eine Struktur namens element. Es existieren viele Objekte dieser struktur; jedes hat vier Nachbarn dessen Adressen in den Pointern neighbour1 bis 4 gespeichert sind.
Die Funtkion getPointerToThis sucht nun welcher pointer eines Nachbarn auf das aktuelle Element zeigt. Das funktioniert auch (denke ich).
Nun will ich den gefundenen Pointer auf ein anderes Element zeigen lassen, dabei bekomme ich aber ein "Segmentation Fault".
Kann mir bitte jemand sagen was ich hier falsch mache? (ausgenommen der Tatsache, dass ich ueberhaupt Pointer verwende)typedef QVector<element> elementList elementList elementList; ..... element* thisElement; .... element** pointerFromNeigbour; pointerFromNeigbour = getPointerToThis (thisElement, thisElement->neighbour1); *pointerFromNeigbour = &m_elementList[index]; .... element** someClass::getPointerToThis (element* thisElement, element* neighbour) { // get pointer pointing on thisElement if (&thisElement== &neighbour->neighbour1) {return &neighbour->neighbour1;} else if (&thisElement== &neighbour->neighbour2) {return &neighbour->neighbour2;} else if (&thisElement== &neighbour->neighbour3) {return &neighbour->neighbour3;} else if (&thisElement== &neighbour->neighbour4) {return &neighbour->neighbour4;} else {return NULL;//ist privisorisch} return NULL; }
-
yumarge schrieb:
Die Funtkion getPointerToThis sucht nun welcher pointer eines Nachbarn auf das aktuelle Element zeigt. Das funktioniert auch (denke ich).
Denke ich nicht.
Du vergleichst die Adressen der Zeiger. Einer davon ist ein Funktionsparameter, d.h. der Vergleich der Adressen der Zeiger wird nie positiv ausgehen.
Du musst den Inhalt der Zeiger vergleichen.Beim Zurückgeben passt dann die Adresse, da dich der Wert ja nicht interessiert, sondern du über die Adresse den Zeiger ändern möchtest.
-
danke hustabear fuer die schnelle und vor allem gut verstaendliche Antwort!
-
Nochwas: du weisst schon, dass die Adresse der Elemente in einem Vektor sich ändern kann, wenn die grösse des Vektors sich ändert?
D.h. wenn du etwas in m_elementList einfügst, kann es sein, dass die Zeiger die ehemals auf Elemente in m_elementList gezeigt haben dann ins leere zeigen.
ps: noch zwei Dinge:
assert() ist gut, wenn man Dinge hat, wo man meint die müssten immer so sein, und das abchecken will.
z.B. in deinem Fall:pointerFromNeigbour = getPointerToThis (thisElement, thisElement->neighbour1); assert(pointerFromNeigbour != 0);Dann hättest du sofort bemerkt dass getPointerToThis - unerwarteterweise - NULL zurückgibt.
Und wenn du nen Segmentation-Fault bekommst...
Wenn du das Programm dabei aus der IDE mit "Start Debug" o.ä. gestartet hast, dann sollte das Programm bei einem Segmentation-Fault oder ähnlichen Fehlern einfach angehalten werden. Und zwar so, dass du in der IDE alle möglichen Dinge angucken/überprüfen kannst. Unter anderem kann man den Inhalt von Variablen ansehen.
Wäre auch eine Möglichkeit gewesen den Fehler selbst schnell zu finden.Ich erwähne das, weil ich schön langsam den Eindruck habe, dass viele Leute einfach nicht wissen was man mit einer modernen (=weniger als 10 Jahre alt) IDE alles machen kann. Speziell was Debuggen angeht. Deine Frage ist da nur eine von vielen die in letzter Zeit gestellt wurden, wo ich mir denke - "wie kann man es schaffen da nicht selbst draufzukommen". Und die einzige Antwort die mir dazu einfällt, ist: indem man nicht weiss wie man mit dem Debugger umgeht

-
hustbaer schrieb:
Nochwas: du weisst schon, dass die Adresse der Elemente in einem Vektor sich ändern kann, wenn die grösse des Vektors sich ändert?
D.h. wenn du etwas in m_elementList einfügst, kann es sein, dass die Zeiger die ehemals auf Elemente in m_elementList gezeigt haben dann ins leere zeigen.
Um noch mögliche Problemlösungen hinzuzufügen:
- Die Größe des vectors direkt bei der Erstellung festlegen
- Einen anderen Container, z.B. std::list verwenden