Autor Beitrag
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: Mo 17.10.05 20:07 
Hi
ne grundlegende Frage.
Ich habe in meinem Programm ein Array mit den Records TBeispiel. Also (da dynamisch):
ausblenden Delphi-Quelltext
1:
BspRecord : array of TBeispiel;					


Wenn ich nun in einer Prozedur, damit ich weniger schreiben muss folgendes deklariere:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Procedur XY;
var Bsp: TBeispiel;
begin
...
Bsp := BspRecord[2]; //die 2 ist nicht relevant, es wird eine passende Zahl verwendet
bsp.blablabla := true;  
... //Bsp wird in seinen Eigenschaften verändert, z.B. s.o.
...
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:
ausblenden Delphi-Quelltext
1:
BspRecord[2] := Bsp;					


Sehe ich das richtig?

_________________
Programmers never die, they just GOSUB without RETURN
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 17.10.05 20:13 
Ja, das siehst Du richtig.

Es gibt aber noch eine elegantere Lösung:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 17.10.05 20:14 
Sehr gut erkannt. Aus diesem Grund verwendet man Zeiger:
ausblenden 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]; //die 2 ist nicht relevant, es wird eine passende Zahl verwendet
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
//So hier der Beispiel-Code dazu
Procedur XY;
var bsp: TBsp;  //PBsp = ^TBsp;
begin
bsp := Utils.GetBsp; //hier hauts nicht hin. Ich bekomme mit GetBsp als Result ein PBsp
//Und wie krieg ich dieses PBsp wieder auf TBsp? Soll heißen, dass TBsp der Record ist, dessen Adresse mir mit PBsp übergeben wird.


Danke schonmal!
Gruß alias5000

_________________
Programmers never die, they just GOSUB without RETURN
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 25.10.05 14:36 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Procedur XY;
var 
  bsp: TBsp;  
  
begin
  bsp := Utils.GetBsp^; // das '^' dereferenziert den Zeiger. 
// Wenn p also eine Addresse ist (und p ist vom Typ PBsp), dann bezeichnet
// p^ das TBsp
...

_________________
Na denn, dann. Bis dann, denn.
BattleFrog
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 53

WIN 2000
Delphi 7 Ent.
BeitragVerfasst: Do 27.10.05 09:58 
wenn man den zeigerquark nicht will, geht auch

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Procedur XY;
begin
  ...
  with BspRecord[2do //die 2 ist nicht relevant, es wird eine passende Zahl verwendet
  begin
    blablabla := true;  
    ... //Bsp wird in seinen Eigenschaften verändert, z.B. s.o.
    ...
  end;
end;
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: Sa 29.10.05 16:39 
user profile iconalzaimar hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Procedur XY;
var 
  bsp: TBsp;  
  
begin
  bsp := Utils.GetBsp^; // das '^' dereferenziert den Zeiger. 
// Wenn p also eine Addresse ist (und p ist vom Typ PBsp), dann bezeichnet
// p^ das TBsp
...

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