Autor |
Beitrag |
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Mo 17.10.05 20:07
Hi
ne grundlegende Frage.
Ich habe in meinem Programm ein Array mit den Records TBeispiel. Also (da dynamisch):
Delphi-Quelltext 1:
| BspRecord : array of TBeispiel; |
Wenn ich nun in einer Prozedur, damit ich weniger schreiben muss folgendes deklariere:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Procedur XY; var Bsp: TBeispiel; begin ... Bsp := BspRecord[2]; bsp.blablabla := true; ... ... end; |
So wie ich mir das denke wird Bsp zu einem eigenen Record, und somit werden die Änderungen nicht mehr in BspRecord[2] übernommen.
Um dies zu tun müsste ich am Ende der Prozedur noch schreiben:
Delphi-Quelltext
Sehe ich das richtig?
_________________ Programmers never die, they just GOSUB without RETURN
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 17.10.05 20:13
Ja, das siehst Du richtig.
Es gibt aber noch eine elegantere Lösung:
Delphi-Quelltext 1: 2:
| var Bla: ^TBeispiel; |
Wodurch Bla ein Zeiger wird und dann Bla := @Beispiele[Index]; zur Zuweisung deines Records (der Referenz auf diesen Record) verwendet werden muss. Delphi löst zwar Pointer in gewissem Maße selber auf; es empfiehlt sich aber der Lesbarkeit halber mit bla^.SomeProp auf den somit referenzierten Record zu verweisen. Die Rückzuweisung (und einiger interner Overhead von Delphi) entfällt dann, weil Änderungen direkt im Array vorgenommen werden.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 17.10.05 20:14
Sehr gut erkannt. Aus diesem Grund verwendet man Zeiger:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Type PBeispiel = ^TBeispiel;
Procedur XY; var Bsp: PBeispiel; begin ... Bsp := @BspRecord[2]; bsp^.blablabla := true; end; |
Jetzt ist BspRecord[2] verändert. Noch besser ist es i.A., kein Array of TBeispiel, sondern ein Array Of PBeispiel zu erzeugen. Dann wird (z.b. bei Sortieroperationen) nicht mehr das gesamte TBeispiel (das ja durchaus einige MB gross sein kann) bewegt, sondern immer nur die Zeiger.
Der "Nachteil" der Zeiger-Variante ist, das Du dich um den Speicher selbst kümmern musst.
_________________ Na denn, dann. Bis dann, denn.
|
|
alias5000 
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Di 25.10.05 13:45
OK, danke erstmal.
Und wie komme ich nun vom PBeispiel wieder zurück auf TBeispiel? Sonst müsste ich alles umschreiben und das wär blöd... dazu kommt noch die Speicherverwaltung.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Procedur XY; var bsp: TBsp; begin bsp := Utils.GetBsp; |
Danke schonmal!
Gruß alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Di 25.10.05 14:36
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Procedur XY; var bsp: TBsp; begin bsp := Utils.GetBsp^; ... |
_________________ Na denn, dann. Bis dann, denn.
|
|
BattleFrog
      
Beiträge: 53
WIN 2000
Delphi 7 Ent.
|
Verfasst: Do 27.10.05 09:58
wenn man den zeigerquark nicht will, geht auch
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Procedur XY; begin ... with BspRecord[2] do begin blablabla := true; ... ... end; end; |
|
|
alias5000 
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Sa 29.10.05 16:39
alzaimar hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Procedur XY; var bsp: TBsp; begin bsp := Utils.GetBsp^; ... | |
Wie ist das dann? Der Übergabeparamter PBsp bezeichnet ja im Ursprung ein BspRecord[x]
Wenn ich nun Bsp := GetBsp^; schreibe, verändere ich dann direkt den BspRecord[x], oder muss ich da dann doch BspRecord[x] := Bsp; schreiben?
_________________ Programmers never die, they just GOSUB without RETURN
|
|
|