Schon wieder ein Problem im Array!!!
-
Hallo!
Wenn mein Array von vorne aufgefüllt ist und jedes abgelegte Objekt in diesem Array mit anderen Objekten (nicht zwingend desselben Arrays) durch Zeiger verknüpft ist, ändern sich diese Verknüpfungen dann, wenn ich in diesem Array ein Objekt in der Art lösche, indem ich alle nachfolgenden Elemente um eine Position im Array weiter nach vorne schiebe?
Soll heißen: Ändert sich die Adresse meines Objektes, wenn ich es im Array verschiebe? Wenn ja, wie kann ich das verhindern?
Danke,
Basti
-
Ein wenig verwirrend, deine Frage, also:
Wenn du ein Array vom Typ "zeiger" hast, dann wird sich kein Zeiger ändern / ungültig werden wenn du einen Zeiger löschst und die anderen verschiebst. Außer natürlich der der gelöscht wurde. Es sei denn du hast ein Array mit Zeigern die auf die Zeiger in dem Array zeigen
Wenn du aber ganz normal die Zeiger auf Objekte zeigen lässt passiert da gar nichts.Wenn du ein Array von Typ "Instanz" hast (Objekte kann man nicht in einem Array speichern das nicht Zeiger vom Typ der Klasse speichern kann), dann ändert sich nicht die Adresse von der Instanz im Feld[5] wenn du das in Feld[4] schiebst. Denn wenn du sagst
Feld[4] = Feld[5];
wird einfach eine Kopie in Feld[4] gespeichert.
Ich hoffe ich hab jetzt keinen Fehler gemacht, wenn du was anderes Wissen wolltest frag nach
-
s-bolz schrieb:
Ändert sich die Adresse meines Objektes, wenn ich es im Array verschiebe?
Ja klar. Wenn du umziehst, bekommst du ne andere Adresse.
Wenn ja, wie kann ich das verhindern?
Nicht verschieben.
-
Danke für den Tip, aber ich glaube, ich werde nicht ganz schlau aus deiner Antwort...
Also dann erklär ich lieber mein Problem etwas ausführlicher:
Ich habe drei Klassen (Adressen, Termine, Dokumente) geschrieben, die alle von der selben Basisklasse (Objektart) abgeleitet sind. Jede dieser Klasse kann mit Objekten der eigenen oder anderen Klassen verknüpft sein. Dazu habe ich in jeder Klasse ein Feld mit Zeigern auf die Basisklasse (Objektart* feld[ANZ]) definiert. Darüber hinaus existiert eine weitere Klasse (SemanticNet), welche u.a. die Verknüpfungen verwalten soll und diverse andere Methoden zur Verfügung stellen soll. Dazu besitzt die Klasse SemanticNet 3 weitere Felder jeweils vom Typ meiner 3 Klassen (Adressen feld1[ANZ]; Termine feld2[ANZ]; Dokumente feld3[ANZ];) Diese Felder sind von vorne an aufgefült (darauf wollte ich besonderen Wert in Hinblick auf Such-Methoden legen), dazu existiert ein Zähler für jedes Feld. Ich habe auch Methoden für das Löschen der speziellen Verknüpfungen der Feldelemente untereinander (in SemanticNet) geschrieben.So viel zur Vorgeschichte...
Nun zum Problem:
Wenn ich in einem der 3 Felder (in SemanticNet) ein Element löschen will, dann habe ich das so realisiert, dass alle nachfolgenden Elemente einfach um eine Position vorrücken. Vorher werden die Methoden zum Löschen der Verknüpfungen aufgerufen, damit alle Verknüpfungen mit dem zu löschenden Element gelöscht werden. Das funktioniert aber leider nicht. Das Element wird zwar gelöscht, aber es scheint als würden die Verknüpfungen einfach auf das nachfolgende Element übergehen und nicht gelöscht werden.Und schließlich zur Frage:
In meinen Methoden kann ich keine Fehler finden. Daher habe ich gedacht, dass sich die Verknüpfungen, die eigentlich zu den nachrückenden Elementen gehören sollten nicht an diesen "hängen" bleiben, sondern wenn diese Elemente weiterrücken (eine Position weiter nach vorne) einfach auf das nächste nachrückende Element "angehängt" werden... Erklären würde ich mir das damit, dass in den Feldern, in denen die Verknüpfungen (Objektart*) stehen, ja Zeiger gespeichert sind auf Elemente meiner Felder in SemanticNet. Wenn ich nun diese Position durch eine neues Element ersetze, dann wird ja auf das neue Element gezeigt. Ist das so richtig und wenn ja, wie kann ich dafür sorgen, dass die Zeiger automatisch auch auf die Position eins weiter vorher zeigen???Vielen Dank, wenn du es schon geschafft ast, bis hierhin zu lesen!
Wenn du mir damit noch helfen könntest, wäre das noch viel besser. Dieses Programm ist nämlich eine Praxisaufgabe für mein Studium. Wenn du zu meinen bisherigen Ansätzen Verbesserungsvorschläge hast, dann wär ich auch nicht abgeneigt... Ich würd ja auch den Code zur Verfügung stellen, aber der ist noch unkommentiert und wahnsinnig lang....Bis dann,
Basti
-
s-bolz schrieb:
Das funktioniert aber leider nicht. Das Element wird zwar gelöscht, aber es scheint als würden die Verknüpfungen einfach auf das nachfolgende Element übergehen und nicht gelöscht werden.
Klar. Wie du schon erkannt hast, sind Pointer einfach Adressen, also Zahlen. Die wissen nicht, worauf sie zeigen. Wenn du dort am Zielort quasi irgendwas hin- und herschiebst, kriegen die das nicht mit (wie auch). Es gibt da auch nicht automagisches, du wirst dich wohl hinsetzen und dir was schlaues Ausdenken müssen.
-
Danke für die Bestätigung, ich habs fast befürchtet... Ich habe da allerdings eine kleine Idee, jedoch weiß ich nicht, ob sich das so realisieren lässt:
Ich verzichte auf die Bedingung, das die Felder (in SemanticNet) von vorne an aufgefüllt sein müssen, d.h. nach längerere Datenpflege werden diese "Löcher" haben. Wenn ich dann allerdings in diesen Feldern etwas suche, muss ich ja irgendwie herauskriegen, ob da ein definiertes Objekt drin abgelegt ist oder nicht. Wie kann ich das machen? Wenn dort Zeiger gespeichert würden, dann könnte ich ja überprüfen, ob da ein NULL-Zeiger steht, z.B. if (!ptr){}
Aber wie mache ich das, wenn dort keine Zeiger oder bool - Variablen drin abgelegt sind? Vor allem unter der Berücksichtigung, dass ich ja später evtl. andere Elemente löschen will, so dass die Überprüfung da dann das gleiche Resultat ergibt...
-
muss ich ja irgendwie herauskriegen, ob da ein definiertes Objekt drin abgelegt ist oder nicht. Wie kann ich das machen? Wenn dort Zeiger gespeichert würden, dann könnte ich ja überprüfen, ob da ein NULL-Zeiger steht, z.B. if (!ptr){}
Aber wie mache ich das, wenn dort keine Zeiger oder bool - Variablen drin abgelegt sind?
Ein weiteres Feld gleicher Größe mit bool-Werten, die dir angeben ob an der entpsrechenden Stelle ein Objekt liegt oder nicht. Allerdings wird das dein Problem nicht vollständig beheben können. Denn irgendwann musst du ja die Löcher auch wieder füllen (wenn neue Daten hinzukommen) - und dann zeigen deine Zeiger auf diese neuen Objekte - was ja wohl nicht erwünscht ist.
Oder noch besser: Design überdenken und vector benutzen. Aber das wird dir wahrscheinlich von der Aufgabenstellung her nicht erlaubt sein, nehm ich an!?
-
smasher1985 schrieb:
Oder noch besser: Design überdenken und vector benutzen. Aber das wird dir wahrscheinlich von der Aufgabenstellung her nicht erlaubt sein, nehm ich an!?
Vector ist mir nicht verboten worden. Ehrlich gesagt, habe ich in einem anderen Thread in diesem Forum das erstemal von Vector gehört. Ich denke, ich werde es benutzen, um die Möglichkeit vc.erase(...) nutzen zu können. Gibt es denn in Vector auch die Möglichkeit, die gelöschten und undefinierten Objekte zu erkennen? Oder bleibt mir dann immer nur die Möglichkeit mir einem weiteren Vektor mit bool Werten?