Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden 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: ?!
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
VarStack.Push(@TmpList); //-> geht nich (Liste ist wieder leer, sobald ich TmpList := TList.Create aufruf) 
VarStack.Push(TmpList);  //-> geht nich (Zugriffsverletzung)
VarStack.Push(@fRecord); //-> geht
VarStack.Push(fRercord); //-> geht nich (Zugriffsverletzung)

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 19.09.09 16:04 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
[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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 19.09.09 17:03 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: So 20.09.09 01:50 
Hey,

user profile iconTryer hat folgendes geschrieben Zum zitierten Posting springen:
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).

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 20.09.09 02:16 
user profile iconBergmann89 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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^^