![]() |
Delphi-Version: 2007
Kann man statische Arrays so gleichsetzen?
Ich hab in meiner Software mehrere Statische Arrays. Hab gesehen daß ich die teilweise so gleichsetze. Bin gerade unsicher ob das überhaupt geht? Es soll keine Kopplung sondern ein Copy stattfinden.
Delphi-Quellcode:
type
TFemVec3 = array [0..cMaxElemCount - 1] of double; TCustomFem = class .. protected FC: TFemVec3; FCopyOfC: TFemVec3; .. end;
Delphi-Quellcode:
procedure TCustomFem.CalcPlatte;
var I, Wdh: integer; begin FCopyOfC := FC; // **************** Wdh := 0; repeat Inc(Wdh); NullA; for I := 1 to FemMaxN do begin FX[I] := 0; FB[I] := 0; end; for I := 1 to FSB do begin Set_SmLc_Platte(I); Load_G_Platte(Fm1[I], Fm2[I], Fm3[I], Fm4[I]); end; for I := 1 to FnUZ do begin Set_SmLc_Stab(I); Load_G_Platte(Fm1[FElemUZ[I]], Fm2[FElemUZ[I]], Fm3[FElemUZ[I]], Fm4[FElemUZ[I]]); end; Set_Last_Platte; Solve; until (Wdh = 3) or (not HaveAbhebendeElementeMitBettung); end; |
AW: Kann man statische Arrays so gleichsetzen?
IIRC werden per CopyOnWrite lediglich die Werte kopiert, d.h. beide Arrays hängen nicht zusammen. Machen wir doch zur Sicherheit ein kleines Testprojekt:
Delphi-Quellcode:
procedure TFormTest.Button1Click(Sender: TObject);
type TMyArray = array[1..2] of integer; var Original, Kopie: TMyArray; begin Original[1] := 100; Original[2] := 1; Kopie := Original; (* Kopiertes Array ausgeben *) ShowMessage(Format('%d, %d', [Kopie[1], Kopie[2]])); Kopie[2] := 42; (* Werte aus Original und geänderter Kopie *) ShowMessage(Format('Original: %d, %d; Kopie: %d, %d', [Original[1], Original[2], Kopie[1], Kopie[2]])); end; |
AW: Kann man statische Arrays so gleichsetzen?
Genau so ein Testprojekt hatte ich auch grade einbringen wollen, aber der rote Kasten war schneller. Dann halt nur noch das Zitat auzs dem DocWiki:
Zitat ![]() Zitat:
|
AW: Kann man statische Arrays so gleichsetzen?
Zuweisungen von statischen Arrays verwenden wie bei Strings das copy-on-write. Insofern verhält es sich so, wie du es erwartest. Bei dynamischen Arrays ist das allerdings anders.
Edit: Der rote Kasten war offensichtlich gerade bei Günther... |
AW: Kann man statische Arrays so gleichsetzen?
OK. Vielen Dank. Hab' fast schon einen mittleren Herzkasper gehabt..
|
AW: Kann man statische Arrays so gleichsetzen?
Statische Arrays werden sofort kopiert, genauso wie Records, Integer usw.
Was die Felder in den Records und statischen Arrays betrifft, da kommt es drauf an. > Bei Strings wird nur der Referenzzeiger kopiert und die Referenzzählung hochgezählt, aber wenn man einen String verändert, dann wird er nur in dem entsprechenden Array geändert (CopyOnWrite). Bei dynamischen Arrays wird nur der interte Zeiger kopiert und die Referenzzählung des Arrays hochgezählt. Leider ist bei dynamischen Arrays das CopyOnWrite schon immer deaktiviert/futsch, womit bei Schreibzugriffen, auf den Array-Inhalt, das Arrays nicht automatisch kopiert wird, wenn der Referenzzähler größer 1 ist. Wenn man also dynamische Arrays kopieren und die Inhalte "unabhängig" ändern will, dann muß man das wirklich kopieren.
Delphi-Quellcode:
MeinString2 := MeinString2;
UniqueString(MeinString2); // das macht Delphi ja automatisch. (für Arrays ist diese Funktion aber nicht öffentlich zugänglich) MeinString2[123] := 'a'; MeinDynamischesArray2 := Copy(MeinDynamischesArray1); //MeinDynamischesArray2 := Copy(MeinDynamischesArray1, 0, High(MeinDynamischesArray1)); MeinDynamischesArray2[123] := ...; MeinStatischesArray2 := MeinStatischesArray1; MeinStatischesArray2[123] := ...; MeinRecord2 := MeinRecord1; MeinRecord2.abc := ...; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 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