Pointer kopieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Pointer kopieren

Beitrag von Targion »

Hallo!
Wenn ich

Code: Alles auswählen

var a,b: Pointer;
begin
  a:=@xyz;
  b:=a;
end;
mache, 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?

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Pointer kopieren

Beitrag von theo »

Entweder verstehe ich dich falsch, oder dein Annahme ist falsch:
b ändert sich nicht automatisch.

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;

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Pointer kopieren

Beitrag von Targion »

Hmm... Dann ist das vielleicht wirklich nicht das Problem. (Ich war von einer ähnlichen Sache wie beim PChar-Problem ausgegangen)

Der Mainthread meiner Anwendung erstellt einen Pointer. Dieser wird dann beim Create() eines neuen von TThread-Abgeleiteten Objektes übergeben.
Der Mainthread arbeitet dann mit dem Pointer weiter, währen der neue TThread eigentlich mit dem alten weitermachen soll. Tut er aber nicht.
Mal sehen, wann ich den Fehler finde! (Bei der PChar-Sache war das Prinzip ähnlich. Könnte es nicht doch am Pointer liegen?)

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Pointer kopieren

Beitrag von marcov »

Targion hat geschrieben:Hallo!
Wenn ich

Code: Alles auswählen

var a,b: Pointer;
begin
  a:=@xyz;
  b:=a;
end;
mache, 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?
Fuer nich typierten Pointer ("pointer") kann das nicht. Man benoetigt auch den Groesse von xyz.

Fuer typierten pointer a is es einfach:

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^));

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Pointer kopieren

Beitrag von Targion »

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?

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Pointer kopieren

Beitrag von marcov »

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?
Nein. Dann sicher nicht. Meistens ist dann auch gemeint der Inhalt des Objekt nicht zu aendern. (es ist eine reine Handle)

Pchar's sind aber eine Ausnahme. Die sind üblich Null terminiert, und dann kann man die Länge kalkulieren mit strlen(p)+1
Zuletzt geändert von marcov am Do 12. Nov 2009, 09:45, insgesamt 1-mal geändert.

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Pointer kopieren

Beitrag von lrlr »

zum "pointer kopieren"

wenn du den pinter kopierst, hast du 2 pointer auf den selben speicherbereich ..

was du scheinbar willst, ist den INHALT zu kopieren,

was natürlich nur geht, wenn man den inhalt kennt...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Pointer kopieren

Beitrag von af0815 »

lrlr hat geschrieben:was natürlich nur geht, wenn man den inhalt kennt...
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Pointer kopieren

Beitrag von Hitman »

af0815 hat geschrieben:
lrlr hat geschrieben:was natürlich nur geht, wenn man den inhalt kennt...
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.
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 ...

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: Pointer kopieren

Beitrag von wolf_z »

Delphi-Mode an oder aus?
Code-Optimierung an oder aus?

Eigentlich kann das nur passieren, wenn der Compiler den Code so optimiert, dass er bei Compilierung für a und b den gleichen Speicherort verwendet. Im Debugger sieht das dann so aus, als hätte man zwei verschiedene Variablen, obwohl man physisch nur noch eine hat. Von der Logik der Programmiersprache her dürfte er das nicht machen. Aber von Delphi beispielsweise weiß ich, dass da bei Pointern immer viel hinter den Kulissen optimiert oder einfach angenommen wird, was man nicht immer durchschaut.

Vielleicht auch mal mit den Ergebnissen von a und b etwas rumrechnen, so dass für den Compiler eine Optimierung nicht mehr möglich ist.

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Pointer kopieren

Beitrag von lrlr »

>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.

nur solange keine strings, objects usw drinnen sind...

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Pointer kopieren

Beitrag von Targion »

Och nöö... Die wirklichkeit war extrem dämlich: Der Compiler hat nichts kaputt optimiert, allerdings wurde eine Methode aufgerufen, die die Referenz auf das Objekt einfach entfernt hat. Und das über mehrere Zwischenschritte und einige funktionen aus der Lib, also so schnell zu durchblicken war's nicht.
Ich habe den Code jetzt durch äquivalentes ersetzt, und alles läuft wie's soll. :mrgreen:
Danke an alle für die Hilfe! In letzer Zeit finde ich viele Probleme, die fast alle mehr oder minder mit merkwürdigem Verhalten in Fremdcode zusammenhängen. :roll: (Und damit, dass ich kurzzeitig den Überblick über alle Methoden verloren habe.)

Antworten