Autor |
Beitrag |
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Sa 19.09.09 06:36
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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 19.09.09 06:47
Ich habe gerade keine Lust die erste Variante näher anzuschauen  (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 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: 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
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
|