Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dynamische Array kopieren (letztes Element fehlt) (https://www.delphipraxis.net/148728-dynamische-array-kopieren-letztes-element-fehlt.html)

himitsu 7. Mär 2010 11:37

Re: dynamische Array kopieren (letztes Element fehlt)
 
Length(arr)-1 = High(arr) ... bei einem dynamischem Array

Und jupp, es ist Copy(source, start, len).

Zitat:

Zitat von brainless
Delphi-Quellcode:
dynArray2 := Copy(dynArray1, 0, high(dynArray1));
FOR i := 1 TO high(dynArray1) DO
begin
  ShowMessage(dynArray1[i].textinhalt + ' vs. ' + dynArray2[i].textinhalt);
end;

Schalte mal die Bereichsprüfung in den Projektoptionen an.

brainless 7. Mär 2010 11:38

Re: dynamische Array kopieren (letztes Element fehlt)
 
edit

uligerhardt 7. Mär 2010 11:42

Re: dynamische Array kopieren (letztes Element fehlt)
 
Man iteriert über alle eingebauten Delphi-Arrays, egal ob statisch, dynamisch, offen oder sonstwie, per
Delphi-Quellcode:
Low(arr) to High(arr)
, und schon passt's.

himitsu 7. Mär 2010 11:49

Re: dynamische Array kopieren (letztes Element fehlt)
 
Zitat:

Zitat von uligerhardt
Man iteriert über alle eingebauten Delphi-Arrays, egal ob statisch, dynamisch, offen oder sonstwie, per
Delphi-Quellcode:
Low(arr) to High(arr)
, und schon passt's.

Delphi-Quellcode:
//var el: telement;
//  arr: array of telement;

for el in arr do
:angel2:

uligerhardt 7. Mär 2010 11:55

Re: dynamische Array kopieren (letztes Element fehlt)
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
//var el: telement;
//  arr: array of telement;

for el in arr do
:angel2:

Oder so - hab ich ganz vergessen. :lol:
Leider ist das for-in manchmal nicht gerade effizient, wenn man es mit "herkömmlichen" for-Schleifen vergleicht. Bei Schleifen über Sets und Arrays ist das aber WIMRE nicht so. Muss ich glatt bei Gelegenheit noch mal checken.

samso 7. Mär 2010 12:38

Re: dynamische Array kopieren (letztes Element fehlt)
 
Mit
Delphi-Quellcode:
dynArray2 := dynArray1;
wird aber nur die Referenz kopiert. Wenn man nun
Delphi-Quellcode:
  dynArray2[0] := IrgendwasNeues;
setzt, wird auch dynArray1[0] geändert! (Anderes als bei Strings). Das Kopieren der Referenz ist nicht das gleiche, wie der Copy-Befehl. Nur beim Copy-Befehl wird der komplette Inhalt kopiert.

Die Delphi-Hilfe dazu:

Zitat:

Wenn X und Y Variablen desselben dynamischen Array-Typs sind, führt die Anweisung X := Y dazu, dass X auf dasselbe Array wie Y zeigt. (Es ist nicht erforderlich, vor dieser Operation Speicher für X zu reservieren.) Im Gegensatz zu Strings und statischen Arrays wird copy-on-write nicht für dynamische Arrays verwendet. Deshalb werden diese nicht automatisch kopiert, bevor einem ihrer Elemente ein Wert zugewiesen wird.

brainless 7. Mär 2010 13:18

Re: dynamische Array kopieren (letztes Element fehlt)
 
Zitat:

Zitat von samso
Mit
Delphi-Quellcode:
dynArray2 := dynArray1;
wird aber nur die Referenz kopiert. Wenn man nun
Delphi-Quellcode:
  dynArray2[0] := IrgendwasNeues;
setzt, wird auch dynArray1[0] geändert! (Anderes als bei Strings). Das Kopieren der Referenz ist nicht das gleiche, wie der Copy-Befehl. Nur beim Copy-Befehl wird der komplette Inhalt kopiert.

stimmt. genau das Problem habe ich jetzt :| also statt dynArray2 := dynArray1; dann doch wieder dynArray2 := Copy(dynArray1); aber dann fehlen wieder Elemente am Ende :wall:

Edit: ich weiß nicht, wo der Fehler war.. aber jetzt funktioniert es auf einmal mit
Delphi-Quellcode:
dynArray2 := Copy(dynArray1, 0, High(dynArray1) + 1);
:gruebel: (danke allen) :thumb:

himitsu 7. Mär 2010 14:00

Re: dynamische Array kopieren (letztes Element fehlt)
 
Zitat:

Zitat von brainless
stimmt. genau das Problem habe ich jetzt :| also statt dynArray2 := dynArray1; dann doch wieder dynArray2 := Copy(dynArray1); aber dann fehlen wieder Elemente am Ende :wall:

kann nicht sein, denn dieses kopiert alles.

Edit: ich weiß nicht, wo der Fehler war.. aber jetzt funktioniert es auf einmal mit
Delphi-Quellcode:
dynArray2 := Copy(dynArray1, 0, High(dynArray1) + 1);
:gruebel: (danke allen) :thumb:[/quote]

Delphi-Quellcode:
dynArray2 := Copy(dynArray1, 0, Length(dynArray1));
oder eben
Delphi-Quellcode:
dynArray2 := Copy(dynArray1);

QuickAndDirty 25. Sep 2018 13:55

AW: dynamische Array kopieren (letztes Element fehlt)
 
Nur mal so am rande bedeutet das, dass folgendes das selbe macht
Delphi-Quellcode:
Procedure Main;
  var Keys:TStringDynArray;

  Procedure KeyFooRef(var arr:TStringDynArray)//MIT VAR
  Begin
    Setlength(arr,4);
    arr[0] := 'Das';
    arr[1] := 'ist';
    arr[2] := 'ein';
    arr[3] := 'Test';
  end;

  Procedure KeyFooVal(arr:TStringDynArray)// OHNE VAR
  Begin
    Setlength(arr,4);
    arr[0] := 'Das';
    arr[1] := 'ist';
    arr[2] := 'ein';
    arr[3] := 'Test';
  end;

Begin
  KeyFooRef(Keys);//Fall 1
  KeyFooVal(Keys);//Fall 2
end;

uligerhardt 25. Sep 2018 14:09

AW: dynamische Array kopieren (letztes Element fehlt)
 
Zitat:

Zitat von QuickAndDirty (Beitrag 1414130)
Nur mal so am rande bedeutet das, dass folgendes das selbe macht

Nö - probier's doch einfach mal aus. Bei Fall 2 wird zwar innerhalb von KeyFooVal die Kopie "arr" verändert, nicht aber das Original "Keys" aus Main.
So sieht man's vielleicht deutlicher:
Delphi-Quellcode:
procedure Main;
var
  Keys: TStringDynArray;

  procedure KeyFooRef(var arr: TStringDynArray); //MIT VAR
  begin
    Setlength(arr, 4);
    arr[0] := 'Das';
    arr[1] := 'ist';
    arr[2] := 'ein';
    arr[3] := 'Test';
  end;

  procedure KeyFooVal(arr: TStringDynArray); // OHNE VAR
  begin
    Setlength(arr, 4);
    arr[0] := 'Das';
    arr[1] := 'ist';
    arr[2] := 'ein';
    arr[3] := 'Test';
  end;

  procedure Raus(AIndex: Integer; const arr: TStringDynArray);
  var
    i: Integer;
  begin
    Write(AIndex, ':');
    for i := Low(arr) to High(arr) do
      Write(' ', arr[i]);
    Writeln;
  end;

begin
  Raus(1, Keys);
  KeyFooRef(Keys); //Fall 1
  Raus(2, Keys);
  Keys := nil;
  Raus(3, Keys);
  KeyFooVal(Keys); //Fall 2
  Raus(4, Keys);
end;


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

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