![]() |
AW: Array of XY löschen
Zitat:
Delphi-Quellcode:
...wird der Inhalt "nachträglich" kopiert. (Stichwort: Copy-On-Write) Ab dann sind auch die Referenzen unterschiedlich.
var
A,B ; array of byte begin Setlength(A,3); B := A; A[0] := $FF; // <---- ...das hier passiert... end; Das aber nur am Rande. |
AW: Array of XY löschen
Zitat:
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. |
AW: Array of XY löschen
:shock: oookay. Aber :shock:!
|
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 ![]() Bei dynamischen Arrays muß man sich dagegen (was auch bei Strings funktiont) mit
Delphi-Quellcode:
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.
SetLength(A, Length(A));
[edit] ach stimmt ja, ![]() |
AW: Array of XY löschen
Zitat:
Bei einer reinen Zuweisung
Delphi-Quellcode:
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
B := A;
Delphi-Quellcode:
B := Copy(A);
|
AW: Array of XY löschen
ehem...
Delphi-Quellcode:
Wo ist jetzt der Unterschied? Hää jetzt steh ich ganz auf dem schlauch!
{$H+}
var A,B : AnsiString; begin A := 'Cool'; B := A; A := 'UnCool'; Writeln(B); //Cool end; Mavarik |
AW: Array of XY löschen
Zitat:
|
AW: Array of XY löschen
Zitat:
DynArrays und Longstrings. Mavarik |
AW: Array of XY löschen
Zitat:
Das funktioniert auch bei (einfachen) dynamischen Arrays ordnungsgemäß.
Delphi-Quellcode:
Aber zugriffe auf den Inhalt funktionieren eben nicht richtig ... jedenfalls nicht so, wie man es sich denken würde.
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
Delphi-Quellcode:
Und hier das selbe Beispiel, nur eben mit einem String.
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
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 |
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 02:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz