Entwickler-Ecke

Sonstiges (Delphi) - Pointer


Aya - So 29.12.02 22:31
Titel: Pointer
Hi,

hab mal ne Frage...
Ich muß ganz ehrlich zugeben das ich bisher NIE nen Pointer verwendet habe.. :oops:

Deswegen mal eine frage, ein Pointer ist doch eine Variable in der auf eine andere Variable gezeigt wird, ja???

Wenn ich nun eine Variable "MyObject" habe, welche vom Typ ein Record ist, und einen "Array of Pointer".

Verwenden tue ich das so:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
type
  TObjects = Record
    [...]
  end;

var
  MyObject: TObjects;
  Pointers: Array of Pointer;

procedure Add(Obj: TObjects);
begin
  SetLength(Pointers,Length(Pointers)+1);
  Pointers[High(Pointers)]:= ... 
  //Hier soll jetzt ein Pointer auf das Objekt welches übergeben wird
  //gesetzt werden, wie?
end;

procedure Main;
var
  i: Integer;
begin
  for i:=Low(Pointers) to High(Pointers) do
    Check(Pointers[i]);
    // Die Procedure Check verlang als übergabe Parameter ein TObjects!
end;


Das ist nur nen grobes beispiel, bitte nich nach dem sinn fragen.. hat hier in dem beispiel keinen *gg*

Au'revoir,
Aya~


smiegel - Mo 30.12.02 09:44

Hallo,

ein Zeiger ist eine Variable, die eine Speicheradresse angibt. Wenn ein Zeiger die Adresse einer anderen Variablen enthält, zeigt er auf die Position dieser Variablen im Speicher oder auf die Daten, die an dieser Position gespeichert sind. Bei einem Array oder einem anderen strukturierten Typ enthält der Zeiger die Adresse des ersten Elements der Struktur. Zeiger sind typisiert. Ist diese Adresse bereits vergeben, enthält der Zeiger die Adresse des ersten Elements.

Was willst Du jetzt wissen?


Udontknow - Mo 30.12.02 10:36

Hallo!

Du musst natürlich dann auch Speicher für diesen Record belegen, sozusagen den Record erstellen. Das machst du mit New bzw. Getmem.


Quelltext
1:
GetMem(Pointers[High(Pointers)],SizeOf(TObjects));                    


Um nun den Record anzusprechen, musst du den Pointer dereferenzieren und dann als TObjects casten:


Quelltext
1:
TObjects(Pointers[High(Pointers)]^).MeineRecordVariable:=3                    


Beim Beenden des Programmes oder beim Ändern des dynamischen Arrays musst du daran denken, den Speicherplatz, den jeder Record belegt, mit Freemem freizugeben.

Cu,
Udontknow