Zeiger kopieren (3 Zeiger...)
-
Hallo ihr
Ich hab ein kleines Problem, und zwar:
Ich habe drei Zeiger. Akt,AkQ,Last..
Last und Akt Zeigt auf jeweils andere Elemente auf dem Stack...
Ich will jetzt mit AktQ auf den INHALT von Akt zeigen.
Praktisch eine Kopie des Zeigers, da ich später Akt auf Last umzeige..
Das heisst praktischt1:
AktQ zeigt auf Akt(damit auf XX1)
Akt zeigt auf Stack Offset XX1
Last zeigt auf Stack Offset XX2t2:
AktQ zeigt auf Akt(damit auf XX2)
Akt zeigt auf Last(damit auf XX2)
Last zeigt auf Stack Offset XX2Ich will jetzt aber das es so aussieht:
t1:
AktQ zeigt auf Stack Offset XX1 (kopie von Akt)
Akt zeigt auf Stack Offset XX1
Last zeigt auf Stack Offset XX2t2:
AktQ zeigt auf Stack Offset XX1 (kopie vom t1-Akt)
Akt zeigt auf Last(damit XX2)
Last zeigt auf Stack Offset XX2Hat irgendjemand ne Idee???
Ich wäre sehr dankbar für jede Hilfe..
mfg stealth00t2:
AktQ zeigt auf Stack Offset XX1
-
Wie machst du es denn bisher (Quellcode)?
-
(...irgendwo am anfang...) Akt=new sMyClass; Last=new sMyClass; Last.prev=Akt; (...irgendwo am anfangEnde...) (..erste Funktion...) (....schleife...) if(bedingung=true) AktQ=Akt; (...schleifeEnde...) Akt=Last; (...erste FunktionEnde...) (...zweite Funktion...) AktQ.Draw(); (..zweite FunktionEnde...)
So in etwa, stark vereinfach..
-
Du erzeugst also Klassen und möchtest darauf verweisen. Probiers mal so:
sMyClass *Akt, *Last, *AktQ; sMyClass klasse1=new sMyClass(); sMyClass klasse2=new sMyClass(); Akt=&klasse1; Last=&klasse2;
-
Geht nicht da es nicht nur 2 Klassen sind sondern eine Beliebige lange kette.
Akt ist das aktuelle Glied (entweder das Letzte oder das durchlaufende Glied)
Last ist das letzte Glied First das erste und AktQ soll das Glied sein das Akt bei t1 war..
-
Du hast also sozusagen ein Array von Klassen und willst mit First auf das erste Element, mit Last auf das letzte und mit Akt auf das "aktuelle" Element zeigen, richtig? Oder ist es eine verkettete Liste?
Obwohl das egal sein sollte. Wenn du First, Last, Akt und AktQ als Zeiger auf deine Klassen definierst, dann müsste es so hinhauen, wie du geplant hast. Vorrausgesetzt ich habe verstanden was du willst. Du musst hald auf die Eigenschaften und Methoden der Klasse nicht mit dem . sondern mit -> zugreifen.
-
Suchst du sowas???
an doppelt verkettete Listen fügt man so ein Element an:class CKlasse { //andere sachen.... CKlasse *prev, *next; } //Hauptpointer.... CKlasse *first = NULL, *last = NULL; //lokale ptr.... CKlasse *ptr, *tmp; ptr = (CKlasse*)malloc(sizeof(*ptr)); //Speicher anfordern if( *first == NULL ) // wenn erstes Element noch leer... { *first = ptr; //...erstes Element setzen (*first) -> prev = NULL; //erstes Element hat keinen Vorgaenger (*first) -> next = NULL; //naechstes Eelemt ist noch nicht da => NULL *last = *first; //aktuelles (letztes) Element auf erstes setzen } else //wenn schon Element(e) da... { tmp = *last; //...das aktuelle zwischenspeichern... *last = ptr; //das aktuelle Element aufs Neu-Eingelesene setzen tmp -> next = *last; //das alte aktuelle aufs Neue zeigen lassen (*last) -> prev = tmp; //das neue aufs alte zeigen lassen (*last) -> next = NULL; //naechstes Element ist noch nicht da.... }
Hoffe du kannst damit was anfangen......
-
Die * im if und else zweig muessen dort nur hin, wenn man die pointer über eine Funktion uebergibt, und diese KEINE globalen Variabeln sind
Also bsp:
wenn nicht global:void neuesElement(CKlasse **first, CKlasse **last) { *first = ptr; //das uebergebene first zeigt jetzt auf pointer (*first) -> next = NULL; //wichtig: Klammer nich vergessen..... //[...] }
Aufruf der Funktion:
neuesElement( &first, &last );
Wenn man daas nicht mt "DoppelPointern" macht, kann man first und last nicht verändern......
first und last sind global
void neuesElement(CKlasse *first, CKlasse *last) { first = ptr; //first zeigt jetzt auf pointer first -> next = NULL; //[...] }
Thats it......
-
Tut mir leid, vielleicht hab ich mich nicht ordentlich ausgedrückt.
Ich habe eine Verkette Liste mit X Elementen (sagen wir mal beispielsweise 100 Elemente)
Das erste Element (E1) ist CVoid *First;
das letzte ist CVoid *Last;
zusätzlich hab ich noch CVoid *Akt;
Wenn ich ein neues Glied einfüge mach ich das so:Akt=new CVoid; FillCVoid(&CVoid); Akt->prev=Last; Akt->next=NULL; Last->next=Akt; Last=Akt;
in kurzfassung, ich benutze akt als neuen Zwischenspeicher dann sag ich dem Last (das jetzt das zweitletzte Element ist) das Akt das nächste sein soll, dann sage ich Akt das Last das Element vor ihm ist, und zuletzt zeige ich mit Last wieder auf das letzte Element..
Das heisst im Normalfall ist Akt und Last immer das vorletzte Element..Wenn ich jetzt aber die Kette durchlaufe mit Akt und ich ein bestimmtes Element brauche, z.B.: E76 dann hab ich soeinen Code hier:
(...globaler Bereich...) CVoid *Akt2; (...gloabler BereichEnde...) (...Funktion eins...) while(Akt!=NULL) { if(Akt->Content==SearchedContent) { Akt2=Akt; break; } Akt=Akt->next } Akt=Last; (...Funktion einsEnde...) (...Funktion zwei...) ReadCVoid(Akt2); (...Funktion zweiEinde...)
mal dokumentiert...
ich brauche Content X
Diesen Content hat nur E76
Nun zeigt Akt auf E76, sprich*Akt -> E76
Last zeigt auf E99 unserem letzten Glied
*Last -> E99
und First auf E0 unserem ersten Glied
*First -> E0
Nun will ich E76 in einer anderen Funktion benutzen. Akt kann ich dazu nicht benützen da das ein Listenzeiger ist. Ich brauche einen zweiten Zeiger, in meinem Fall *Akt2..
Jetzt sieht das so aus...*Akt2 -> *Akt -> E76
*Akt2 hat den gleiche Inhalt wie *Akt weil es auf den Inhalt von *Akt zeigt.
Also in dem Moment E76
Wenn ich aber die schleife beenden dann sieht es so aus*Akt2 -> *Akt -> E99
und zwar weil ich am ende ja Akt=Last; mache..
Aber ich würde gerne sowas haben:
In der schleife:*Akt -> E76 // *Akt2 -> E76
nach der schleife
*Akt -> *Last -> E99 *Akt2 -> E76
Das heist *Akt2 soll direkt auf E76 zeigen und nicht erst auf Akt...
ich will also*Akt2 -> *Akt -> E76
in
*Akt2 -> E76 *Akt -> E76
umwandeln. Also soll Akt2 kein Zeiger auf Akt sein sondern lediglich ein Zeiger auf E76..
mfg stealth00
ich hoffe es sind nicht zuviele Code-Tags
-
Hm, verstehe nich so ganz was du meinst...
Wenn du akt2 = akt; schreibst und dann akt = last;, dann zeigt doch akt2 noch immer auf den selben Inhalt auf dem akt vorher gezeigt hat, also E76.
Wenn akt auch auf E76 zeigen soll, dann setz es doch einfach nach der Funktion nicht auf last!?!?! Wo is da der Haken? Hab ich was falsch verstanden?
Wozu hast du überhaupt akt und last? Einer davon reicht, weil akt immer = last ist....
du brauchts den scheinbar (habe ich so rausgelesen:)Akt=new CVoid; FillCVoid(&CVoid); Akt->prev=Last; Akt->next=NULL; Last->next=Akt; Last=Akt;
nur um das neue Elemnt zu setzen... also kann akt genauso gut lokal sein, CVoid *tmp oder CVoid *ptr...
zum einlesen kannst du auch folgendes verwenden...
void FillInt(CVoid **last, Inhalt inhalt) { (*last)->next = (CVoid*)malloc(sizeof(CVoid)); (*last)->next->inhalt = inhalt; (*last)->next->prev = *last; (*last)->next->next = NULL; (*last) = (*last)->next; }
hier sind last und first wieder lokal, man muss sie alo als Reference übergeben.. first muss schon gesetzt sein und last muss mindestens auf first zeigen, sonst funzt es nich...
Wiegeagt, weiß irgendwie nich genau was du jetzt willst, vll. hab ich dir ja trotzdem ein wenig egholfen...
MfG,
JTK!