Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Hilfe bei Pointern
Bergmann89 - Sa 19.09.09 06:36
Titel: Hilfe bei Pointern
HI,
ich arbeite grad zeimlich viel mit Pointern, aber irgendwie blick ich nich durch. Wenn ich ein Objekt hab, welches ich mit
Obeject1 := TObject.Create erzeuge, und das dann mit
Object2 := Object1 weitergeb, dann wird doch auch bloß der Pointer übergeben, oder?
Zu meinem eigentlichen Problem: Ich habe mehrer Objekte, die eine Liste enthalten. Und die sollen alle die gleiche Liste haben.
So gehts:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if (Ident = 'record') and NextIsType then begin TmpList := TList.Create; for k := 1 to VarCount do PVar(PList(ListStack.Look)^[PList(ListStack.Look)^.Count-k])^.fRecord := TmpList; ListStack.Push(@PVar(PList(ListStack.Look)^[PList(ListStack.Look)^.Count-1])^.fRecord); end; |
so gehts nich: ?!
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| if (Ident = 'record') and NextIsType then begin TmpList := TList.Create; for k := 1 to VarCount do PVar(PList(ListStack.Look)^[PList(ListStack.Look)^.Count-k])^.fRecord := TmpList; ListStack.Push(@TmpList); end; |
Aber eigentlich ist doch fRecord und TmpList jetzt das gleiche, warum hab ich dann unterschiedliche ergebnisse?
Ich bin ratlos! Oder liegt es daran, das TmpList eine lokale variable der Function ist und fRecord eine Variable des Objekts in dem die Funktion aufgerufen wird. Die Funktion wird aber auch nicht verlassen und ich dachte immer, das die lokalen Variablen erst zum Funktionsende wieder freigegeben werden...
MfG & Thx Bergmann.
jaenicke - Sa 19.09.09 06:47
Ich habe gerade keine Lust die erste Variante näher anzuschauen :mrgreen: (wie wäre es mit Zwischenvariablen...), aber bei der zweiten ist jedenfalls ein @ zu viel. ;-)
Denn TmpList ist ja ein Pointer auf ein Objekt vom Typ TList. Mit dem @ wiederum nimmst du jetzt die Adresse der Variablen, in der dieser Pointer liegt. Du willst aber mit dem Objekt(-pointer) selbst arbeiten (vermute ich ;-)), also ohne @.
Bergmann89 - Sa 19.09.09 15:07
Hey,
TmpList und
fRecord sind vom Typ
TList. Und
VarStack.Push() erwartet einen Pointer. Wenn ich das @ beim
TmpList weg lass, dann gibts später irgendwann ne Zugriffsverletzung.
Also nochma zusammengefasst:
Delphi-Quelltext
1: 2: 3: 4:
| VarStack.Push(@TmpList); VarStack.Push(TmpList); VarStack.Push(@fRecord); VarStack.Push(fRercord); |
Und ich versteh jetzt nich wo der Unterschied zwischen
fRecord und
TmpList is. normalerweiße müsste es doch beides das selbe sein, hab ja
TmpList an
fRecord übergeben?!
MfG Bergmann.
Tryer - Sa 19.09.09 16:04
Bergmann89 hat folgendes geschrieben : |
[delphi]VarStack.Push(@TmpList); //-> geht nich (Liste ist wieder leer, sobald ich TmpList := TList.Create aufruf) |
Das verwirrt jetzt irgendwie.. Du möchtest einerseits allen die gleiche Liste zuweisen, andererseits legst Du eine Instanz auf den Stack um dann eine neue zu erzeugen?
Eine saubere Lösung wäre vielleicht wenn alle Objekte den selben Parent haben, und dieser die Listeninstanz führt.
MfG,
Dirk
Kha - Sa 19.09.09 17:03
Bergmann89 hat folgendes geschrieben : |
Wenn ich das @ beim TmpList weg lass, dann gibts später irgendwann ne Zugriffsverletzung. |
Das ist aber der richtige Weg, der Fehler muss an anderer Stelle stecken.
Wenn du einen Pointer auf eine Objektreferenz hast, bist du sicherlich auf dem Holzweg.
Bergmann89 - So 20.09.09 01:50
Hey,
Tryer hat folgendes geschrieben : |
Das verwirrt jetzt irgendwie.. Du möchtest einerseits allen die gleiche Liste zuweisen, andererseits legst Du eine Instanz auf den Stack um dann eine neue zu erzeugen?
Eine saubere Lösung wäre vielleicht wenn alle Objekte den selben Parent haben, und dieser die Listeninstanz führt. |
Mag sein, das es jetzt verwirrt, aber das ist ja auch nich der ganze Quelltext... Mit nem Parent hab ich auch schon überlegt, aber das geht nich (jedenfalls in meinem Projekt nich).
Kha hat folgendes geschrieben : |
Das ist aber der richtige Weg, der Fehler muss an anderer Stelle stecken.
Wenn du einen Pointer auf eine Objektreferenz hast, bist du sicherlich auf dem Holzweg. |
Wenn ich dann wieder vom Stack Pope, muss ich das so interpretieren, oder:
TList(Stack.Pop) dann weiß ich glaub ich wo der Fehler ist...
MfG Bergmann.
jaenicke - So 20.09.09 02:16
Bergmann89 hat folgendes geschrieben : |
Wenn ich dann wieder vom Stack Pope, muss ich das so interpretieren, oder: TList(Stack.Pop) |
Richtig, denn Delphi muss ja nur gesagt werden durch den Cast, dass der Pointer auf ein TList-Objekt zeigt.
Bergmann89 - So 20.09.09 15:45
Gut, jetzt gehts. Ich hab nich dran gedacht das Variablen die ein Objekt als Typ haben ja auch nur Zeiger sind. Und da hab ich mir zu jedem Objekt n ZeigerTyp gemacht un das dann wie mit nem Integer gemacht xD TmpList := PList(Stack.Pop)^; Und deshalb hat das mit dem Stack.Push(@TmpList) auch funktioniert...
MfG Bergmann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!