Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variablenzuweisung, wann kopie, wann verknüpfung (https://www.delphipraxis.net/16332-variablenzuweisung-wann-kopie-wann-verknuepfung.html)

empanyc 15. Feb 2004 15:41


Variablenzuweisung, wann kopie, wann verknüpfung
 
Hi,

ich hätte mal ne Frage zu (meinem) allgemeinen Verständnis von Variablenzuweisungen.
Und zwar, was passiert, wenn ich einem bestimmten Objekt/Record/... einen
gleichwertigen Typ zuweise?

Ich habe z.B. einen Typ

Delphi-Quellcode:
type titem = record
      s: string;
      ...
    end;

    Tdaten = array of titem;
...
var daten : tdaten;
    daten2 : tdaten;
Was passiert jetzt wenn ich "daten := daten2;" in einer Prozedur aufrufe?
Zeigt die Variable "daten" nun auf die Werte in "daten2" oder hat es
"eigene" Werte?
Wie kann ich die 2 Fälle explizit im Quellcode unterscheiden?
Soll heißen, wie muss ich meinem Code dann ergänzen um den gewünschten
Fall zu erhalten?

Ich hab diese Probleme halt bisher "umgangen" und es hat funktioniert,
aber es würde mich mal interessieren, wie ihr das löst.

Vielen Dank!
Mario

Chewie 15. Feb 2004 15:52

Re: Variablenzuweisung, wann kopie, wann verknüpfung
 
Ein Record ist ein Werttyp (value-type). D.h. bei einer Zuweisung wird der gesamte Inhalt eines Records kopiert.
Um bei einer solchen Zuweisung nur die Zeiger zu kopieren, musst du Variablen vom Typ ^TMyRecord benutzen, also einen Zeiger auf ein solche Record.

Bei Objekten ist das auch so, allerdings sind Objekte Referenztypen. Bei einer Zuweisung object1 := object2 wird bei Objekten immer nur der Zeiger kopiert, es existiert also nur ein Objekt im Speicher.

Bernd Ua 15. Feb 2004 15:53

Re: Variablenzuweisung, wann kopie, wann verknüpfung
 
Hi,

handelt es sich bei der Variablen um einen Record oder auch ein klassisches, statisches Array
( Array[0..x] of TIgendwas) wird bei der Zuweisung kopiert.
Bei dynamischen Array und Objekten die mit class deklariert sind ist das nicht so.
Dein Objekt wie Button1 zum Beispiel ist in wirklichkeit ein Pointer auf eine Datenstruktur auf dem Heap,
die Anweisung Button2 := button1 ; dupliziert nur die Adresse nicht das Objekt.
Auch dynamische Arrays werden auf dem Heap von Delphi verwaltet und sind in Wirklichkeit nur Pointer auf die Datenstruktur. ( SizeOf(TDaten) liefert zum Beispiel unabhängig von der Grösse des arrays immer 4)

Delphi-Quellcode:
 daten := daten2;
dupliziert auch hier nur den Pointer auf ein und denselben Inhalt, änderst du die Kopie änderst du auch das Orginal, was leider anders ist als bei normalen Arrays.
Willst Du Delphi zwingen eine Kopie anzulegen, setze einfach die Länge der Kopie oder des Orginals nach der Zuweisung neu ( Eine Änderung der Länge ist nicht erforderlich).

Delphi-Quellcode:
SetLength(daten2,Length(daten2));
Grüsse Bernd

empanyc 15. Feb 2004 16:14

Re: Variablenzuweisung, wann kopie, wann verknüpfung
 
Wie bekomme ich denn "korrekt" eine Kopie eines Objekts?

@Bernd Ua:
Soll also heißen, wenn der Befehl "daten := daten2;" ausgeführt worden ist und
ich danach einen von beiden eine neue Größe mit "setlength" zuweise,
werden beide eigenständig?
Des würde ja bedeuten, dass ich mit "daten" aus dem Beispiel nur die Einträge
verändern könnte aber sobald ich etwas an der Größe ändere, wird "daten"
eigenständig?

Danke
Mario

Bernd Ua 15. Feb 2004 16:29

Re: Variablenzuweisung, wann kopie, wann verknüpfung
 
Zitat:

Wie bekomme ich denn "korrekt" eine Kopie eines Objekts?
Das ist einfach : garnicht - zumindest nicht out of the box. Im Gegensatz zu C++ kennt ObjectPascal keinen Copy-Constructor. Bei Nachfahren von TPersistent gibt es allerdings eine standardisierte Methode, den Inhalt von einer Klasse in die nächste zu schieben. Bei eigenen Nachfahren muss die allerdings erstmal implementiert werden.

Zitat:

Soll also heißen, wenn der Befehl "daten := daten2;" ausgeführt worden ist und
ich danach einen von beiden eine neue Größe mit "setlength" zuweise,
werden beide eigenständig?
Ja

Zitat:

Des würde ja bedeuten, dass ich mit "daten" aus dem Beispiel nur die Einträge
verändern könnte aber sobald ich etwas an der Größe ändere, wird "daten"
eigenständig?
Ja leider. Beispiel :

Delphi-Quellcode:
var
  daten, daten2 : Array of Integer;
begin
  //...
  daten2 := daten;
  daten[0] := 12; // daten[0] und daten2[0] sind 12
  ...
  SetLength(daten,Length(daten));
  daten[1] := 12; // daten[1] ist 12 , daten2 wurde nicht geändert
  ...

meiner Einschätzung nach eine wirklich unschöne Inkonsistenz der dynamischen Arrays,
die in krassem Widerspruch zum Verhalten statischer Arrays auf der einen und der durchgängigen
Copy-on-Write-Semantik bei langer Strings auf der anderen Seite steht.

Bernd

empanyc 15. Feb 2004 16:46

Re: Variablenzuweisung, wann kopie, wann verknüpfung
 
Dann muss ich bei Objekten praktisch Eigenschaft für Eigenschaft kopieren... :wall:

Naja, was solls.
Ich bekomm halt zur Zeit bei meinem Programm so schöne nichtssagende Zugriffsverletzungen
beim Beenden. Ich vermute, dass es damit was zu tun hat. Delphi ist ja da sehr
hilfreich bei der Fehlersuche. *ironie*

Vielen Dank!
mario


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz