Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Array of XY löschen (https://www.delphipraxis.net/170038-array-xy-loeschen.html)

Medium 27. Aug 2012 16:04

AW: Array of XY löschen
 
Zitat:

Zitat von Mavarik (Beitrag 1180150)
Delphi-Quellcode:
var
  A,B ; array of byte
begin
  Setlength(A,3);

  B := A; // Kopiert den Pointer und nicht den Inhalt, oder?
end;

Ja. Sobald aber...
Delphi-Quellcode:
var
  A,B ; array of byte
begin
  Setlength(A,3);

  B := A;
  A[0] := $FF; // <---- ...das hier passiert...
end;
...wird der Inhalt "nachträglich" kopiert. (Stichwort: Copy-On-Write) Ab dann sind auch die Referenzen unterschiedlich.

Das aber nur am Rande.

himitsu 27. Aug 2012 16:16

AW: Array of XY löschen
 
Zitat:

Zitat von Medium (Beitrag 1180163)
...wird der Inhalt "nachträglich" kopiert. (Stichwort: Copy-On-Write) Ab dann sind auch die Referenzen unterschiedlich.

Wäre schön, wenn es so wäre, aber probier es ruhig mal aus. (siehe ein paar Posts weiter vorne)

Copy-On-Write ist leider nicht aktiv :wall:
Wäre ja zu praktisch, wenn es einen Compilerschalter gäbe, um das für alle/bestimmte Arrays zu aktivieren.

Ein LongString (AnsiString und UnicodeString) ist ja auch "nur" ein (etwas aufbemotztes) dynamisches Array of Char (außer daß der Index bei 1 beginnt, hinten noch ein Feld mehr dranhängt, mit #0 drin, und neuerdings auch noch mit CodePage und CharSize, welche neben dem Referentzähler liegen), aber da funktioniert das Copy-On-Write wenigstens.

Medium 27. Aug 2012 16:24

AW: Array of XY löschen
 
:shock: oookay. Aber :shock:!

himitsu 27. Aug 2012 16:38

AW: Array of XY löschen
 
Bin darüber leider auch schon gestolpert und voll auf die Fresse gefallen, weil ich damit gerechnet hatte, daß es automatisch umkopiert wird.

Ist richtig toll, weil ich mich nun selber darum kümmern mußte.
Für Strings gibt es Delphi-Referenz durchsuchenUniqueString, womit man dafür sorgen kann, daß es nur eine Referenz in dieser Variable gibt, also falls man mal über wilde Pointer schreibend auf den Stringinhalt zugreifen möchte.

Bei dynamischen Arrays muß man sich dagegen (was auch bei Strings funktiont) mit
Delphi-Quellcode:
SetLength(A, Length(A));
behelfen und hoffen, daß Emba nicht mal auf die Saublöde Idee kommt und intern urplötzlich abprüft, ob sich die Länge wirklich ändert und dann nix macht, was dann sehr blöde enden würde.
[edit] ach stimmt ja, Delphi-Referenz durchsuchenCopy ohne Start+Länge gab's ja auch noch, auch wenn's nicht unbedingt in der OH steht.

Uwe Raabe 27. Aug 2012 16:47

AW: Array of XY löschen
 
Zitat:

Zitat von himitsu (Beitrag 1180168)
Ist richtig toll, weil ich mich nun selber darum kümmern mußte.

´

Bei einer reinen Zuweisung
Delphi-Quellcode:
B := A;
wird nur der Pointer auf das Array kopiert und beide Array-Variablen verweisen auf dasselbe Array. Willst du eine separat beschreibbare Kopie, schreibst du eben
Delphi-Quellcode:
B := Copy(A);

Mavarik 27. Aug 2012 17:17

AW: Array of XY löschen
 
ehem...

Delphi-Quellcode:
{$H+}
var
  A,B : AnsiString;

begin
  A := 'Cool';
  B := A;
  A := 'UnCool';

  Writeln(B); //Cool
end;
Wo ist jetzt der Unterschied? Hää jetzt steh ich ganz auf dem schlauch!

Mavarik

mkinzler 27. Aug 2012 17:22

AW: Array of XY löschen
 
Zitat:

Wo ist jetzt der Unterschied? Hää jetzt steh ich ganz auf dem schlauch!
Obwohl ein AnsiString eigentlich auch nur ein Zeiger ist, wird der Inhalt bei der Zuweisung kopiert. Spätere Änderungen werden deshalb nicht erkannt.

Mavarik 27. Aug 2012 17:30

AW: Array of XY löschen
 
Zitat:

Zitat von mkinzler (Beitrag 1180181)
Obwohl ein AnsiString eigentlich auch nur ein Zeiger ist, wird der Inhalt bei der Zuweisung kopiert. Spätere Änderungen werden deshalb nicht erkannt.

Schon klar. Dann gibt es aber doch noch mehr unterschiede zwichen
DynArrays und Longstrings.

Mavarik

himitsu 27. Aug 2012 17:37

AW: Array of XY löschen
 
Zitat:

Delphi-Quellcode:
var
  A,B : AnsiString;

begin
  A := 'Cool';
  B := A;
  A := 'UnCool';

  Writeln(B); //Cool
end;

Zuweisungen auf den kompleten Inhalt sind etwas Anderes.
Das funktioniert auch bei (einfachen) dynamischen Arrays ordnungsgemäß.
Delphi-Quellcode:
var
  A, B: array ob Byte;

SetLength(A, 3);
A[0] := 123;
A[1] := 456;
A[2] := 798;

B := A;

SetLength(B, 3); // SetLength oder Copy macht B unique und A wird nicht mehr verändert
B[0] := 111;
B[1] := 963;
B[2] := 111;

ShowMessage(IntToStr(A[1])); // 456
ShowMessage(IntToStr(B[1])); // 963
Aber zugriffe auf den Inhalt funktionieren eben nicht richtig ... jedenfalls nicht so, wie man es sich denken würde.
Delphi-Quellcode:
var
  A, B: array ob Byte;

SetLength(A, 3);
A[0] := 132;
A[1] := 456;
A[2] := 798;

B := A;

B[1] := 963;

ShowMessage(IntToStr(A[1])); // hier würde man ja 456 erwarten, aber erhält 963
ShowMessage(IntToStr(B[1])); // 963
Und hier das selbe Beispiel, nur eben mit einem String.
Delphi-Quellcode:
var
  A, B: string;

A := 'abc';

B := A;

B[2] := 'x';

ShowMessage(A[2] + ' - ' + A); // b - abc
ShowMessage(B[2] + ' - ' + B); // x - axc

Bummi 27. Aug 2012 23:00

AW: Array of XY löschen
 
@himitsu
nur so am Rande, wie bekommst Du die Monsterwerte in ein Array of Byte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.
Seite 2 von 3     12 3      

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