AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kann man statische Arrays so gleichsetzen?

Ein Thema von Bjoerk · begonnen am 9. Okt 2014 · letzter Beitrag vom 9. Okt 2014
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Kann man statische Arrays so gleichsetzen?

  Alt 9. Okt 2014, 10:45
Delphi-Version: 2007
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

AW: Kann man statische Arrays so gleichsetzen?

  Alt 9. Okt 2014, 10:57
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Kann man statische Arrays so gleichsetzen?

  Alt 9. Okt 2014, 10:59
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 aus dem DocWiki:

Zitat:
Unlike strings and static arrays, copy-on-write is not employed for dynamic arrays, so they are not automatically copied before they are written to. For example, after this code executes:
Delphi-Quellcode:
 var
   A, B: array of Integer;
   begin
     SetLength(A, 1);
     A[0] := 1;
     B := A;
     B[0] := 2;
   end;
the value of A[0] is 2. (If A and B were static arrays, A[0] would still be 1.)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#4

AW: Kann man statische Arrays so gleichsetzen?

  Alt 9. Okt 2014, 11:00
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...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Kann man statische Arrays so gleichsetzen?

  Alt 9. Okt 2014, 11:11
OK. Vielen Dank. Hab' fast schon einen mittleren Herzkasper gehabt..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#6

AW: Kann man statische Arrays so gleichsetzen?

  Alt 9. Okt 2014, 17:33
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 := ...;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 9. Okt 2014 um 17:56 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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