Autor Beitrag
Bayo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 02.01.03 09:03 
Hi zusammen

Ich habe folgendes Problem: Ich habe zwei Zeiger und möchte den Inhalt z. B. 8 Bytes an die Adresse des andern Zeigers schreiben. Dabei darf aber nicht einfach die Adresse des zweiten Zeiger auf die des ersten gesetzt werden. Ich habe es mit der Funkton "Move" probiert:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
PItemBT = ^TItemBT;
TItemBT = array[0..100] of Pointer;

FList: PItemBT;

procedure TRecordListBT.InsertItem(index: Integer; adr: Pointer);
begin
  System.Move(adr, FList^[index], ItemSize);
end;


Bei dieser Variante ändert er mir die Adresse von "FList^[index]" auf "adr", was er nicht darf!

Hat evtl. jemand vom euch schon so was ähndliches gemacht?? Freue mich über jede Antwort!

Grüsse Dominic
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 02.01.03 11:11 
Du hast vergessen adr zu dereferenzieren.

Mach aus System.Move(adr, FList^[index], ItemSize);
System.Move(adr^, FList^[index], ItemSize);

_________________
Ist Zeit wirklich Geld?
Bayo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Fr 03.01.03 13:53 
Erstamls bedanke ich mich bei Andy, hat mich schon weiter gebracht!

Leider bin ich wieder auf ein interessantes Verhalten gestossen. Um dieses zu demonstrierer habe ich mein Beispiel noch ein wenig abgeändert:

ausblenden 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:
var
FZeiger: Pointer;

procedure TForm1.Button1Click(Sender: TObject);
var
  str: String;
begin
  str := 'Test0';
  GetMem(FZeiger, SizeOf(String));
  System.Move(str, FZeiger^, SizeOf(String));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  str: String;
begin
  str := 'Test'+IntToStr(0);
  GetMem(FZeiger, SizeOf(String));
  System.Move(str, FZeiger^, SizeOf(String));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Showmessage(String(FTest^));
end;


Clicke ich zuerst auf den Button1, dann auf den Button3, wird mir der String "Test0" ausgegeben. Clicke ich zuerst auf den Button2, dann auf den Button3, wird irgend ein undefinierter Wert angezeigt.

Beim Button2 verwende ich die Funktion "IntToStr", um die Varibale "str" zu initialisieren. Ich könnte auch eine beliebige andere Funktion mit einem String als Rückgabewert nehmen und es würde nicht funktionieren.

Was ist in diesem Fall der unterschied zwischen:

str := 'Test0';
und
str := 'Test'+IntToStr(0);

Ich badanke mich für eue Bemühungen!

Grüsse Dominic