Entwickler-Ecke
Dateizugriff - Daten verschieben
Bayo - Do 02.01.03 09:03
Titel: Daten verschieben
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:
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 - 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);
Bayo - 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:
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!