Wenn ich
Code: Alles auswählen
var a,b: Pointer;
begin
a:=@xyz;
b:=a;
end;
Code: Alles auswählen
var a,b: Pointer;
begin
a:=@xyz;
b:=a;
end;
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var a,b: Pointer;
c:String;
begin
c:='mal sehen';
a:=@c[1];
b:=a;
writeln(PtrInt(a),' ',PtrInt(b));
a:=@c[2];
writeln(PtrInt(a),' ',PtrInt(b));
end;
Fuer nich typierten Pointer ("pointer") kann das nicht. Man benoetigt auch den Groesse von xyz.Targion hat geschrieben:Hallo!
Wenn ichmache, dann enthält b ja eine Referenz auf a. Wenn nun a verändert wird, verändert sich b automatisch auch. Das will ich aber nicht. Wie kann ich also den Pointer auf einen Speicherbereich einfach kopieren?Code: Alles auswählen
var a,b: Pointer; begin a:=@xyz; b:=a; end;
Code: Alles auswählen
getmem(b,sizeof(a^)); // sizeof(a^) is den Groesse von das Typ wo a nach weist.
move(a^,b^,sizeof(a^));
Nein. Dann sicher nicht. Meistens ist dann auch gemeint der Inhalt des Objekt nicht zu aendern. (es ist eine reine Handle)Targion hat geschrieben:Danke erstmal! Dummerweise kenne ich den Typ des Objektes, auf den der Pointer zeigt, nicht. Der Pointer wird aus einer C-Lib importiert.
Gibt es keine andere Möglichkeit?
Es muß nur der Anfang und die Größe bekannt sein, nicht aber was darinnen ist. Dann geht eine einfache Kopieraktion ohne Kenntnis des Inhalts.lrlr hat geschrieben:was natürlich nur geht, wenn man den inhalt kennt...
Bei einer flachen Kopie, ja. Willst du aber eine tiefe Kopie (also auch die referenzierten Strings, andere referenzierte Objekte, etc.), musst du den Inhalt kennen. Und das ist in den meisten Fällen so. Ich hab zumindest bisher noch keine flache Kopie gebraucht und fast jedes Objekt (oder auch Record) beinhaltet häufig zumindest einen String ...af0815 hat geschrieben:Es muß nur der Anfang und die Größe bekannt sein, nicht aber was darinnen ist. Dann geht eine einfache Kopieraktion ohne Kenntnis des Inhalts.lrlr hat geschrieben:was natürlich nur geht, wenn man den inhalt kennt...