Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

brainless 7. Mär 2010 10:39


dynamische Array kopieren (letztes Element fehlt)
 
hallo,

ich arbeite seit kurzem mit dynamischen Arrays (vorher immer mit statischen) - also bin Anfänger ;) - und nun wollte ich ein komplettes Array in ein anderes kopieren. Mein erster Ansatz mit:
Delphi-Quellcode:
procedure TForm_liste.BtnSortClick(Sender: TObject);
var i, j: Integer;
// ...
    dynArray1: array of TIrgendwas;
    dynArray2: array of TIrgendwas;
begin

  SetLength(dynArray1, 200); //Länge des dynArray's
  SetLength(dynArray2, 200); //Länge des dynArray's

// irgendwelche Werte werden dynArray1 zugewiesen ...

    FOR i := 1 TO high(dynArray1) DO
     begin
      dynArray2[i] := dynArray1[i];
     end;
hat nicht funktioniert..
habe dann gegooglet und die Funktion Copy(dynArray) gefunden:
Delphi-Quellcode:
    // Array kopieren
    dynArray2 := Copy(dynArray1, 0, high(dynArray1));
wenn ich dann aber die beiden Arrays mit:
Delphi-Quellcode:
    FOR i := 1 TO high(dynArray1) DO
     begin
      ShowMessage(dynArray1[i].textinhalt + ' vs. ' + dynArray2[i].textinhalt);
     end;
vergleiche, dann steht beim letzten Element immer "text123 vs. [komische Zeichen]"

also scheinbar wird das letzte Element nicht kopiert ?! :?:

hat jemand ein Tipp, was ich falsch mache? :wink:
oder eine andere/bessere Möglichkeit dyn. Arrays zu kopieren? (aber muss eine richtige Kopie sein, nicht nur Reference)

SirThornberry 7. Mär 2010 10:43

Re: dynamische Array kopieren (letztes Element fehlt)
 
dynamische Arrays beginnen immer bei 0. Ein dynamisches Array mit 3 Elementen geht also von yourarray[0] bis yourarray[2]

[Edit]
Herzlich Willkommen in der Delphi-Praxis :dp:

brainless 7. Mär 2010 10:53

Re: dynamische Array kopieren (letztes Element fehlt)
 
(hatte oben noch einen kleinen Fehler drin bei der ersten FOR-Schleife)

Zitat:

Zitat von SirThornberry
Herzlich Willkommen in der Delphi-Praxis :dp:

danke :)

Zitat:

Zitat von SirThornberry
dynamische Arrays beginnen immer bei 0. Ein dynamisches Array mit 3 Elementen geht also von yourarray[0] bis yourarray[2]

ja aber high(dynArray1) müsste doch dann genau das letzte Element erwischen ,oder?
also im Prinzip wird bei mir oben doch nur überall das erste Element (yourarray[0]) übersprungen? bzw. bleibt leer

das erlkärt noch nicht das Fehlen des letzten Element ,oder? :?:

himitsu 7. Mär 2010 10:57

Re: dynamische Array kopieren (letztes Element fehlt)
 
Es gibt zwar eine Refferenzzählung bei dynamischen Arrays, welche manchmal ihre Probleme hat.
Sonst würde man mit Folgendem keine Probleme haben.
Delphi-Quellcode:
dynArray2 := dynArray1;
Vorallem wird "leider" nicht vor dem Zuweisen eines Wertes geprüft, ob es eine Singleinstanz ist und somit werden die Werte direkt und somit auch aller gleichen Instanzen geändert.

Delphi-Quellcode:
dynArray2 := Copy(dynArray1);
sorgt dafür, daß es danach eine Einzelinstanz ist.
Sowas wie UniqueString gibt es leider nur für Strings (welche allerdings auch "nur" 'ne Sonderform von dynamischen Char-Arrays sind.

brainless 7. Mär 2010 11:11

Re: dynamische Array kopieren (letztes Element fehlt)
 
Delphi-Quellcode:
dynArray2 := dynArray1;
dann bekomme ich die folgende Fehlermeldung:
Zitat:

[Fehler] Uliste.pas(301): Inkompatible Typen
obwohl beide Arrays vom selben Typ sind: (siehe 1. Beitrag)
Delphi-Quellcode:
procedure TForm_liste.BtnSortClick(Sender: TObject);
var i, j: Integer;
// ...
    dynArray1: array of TIrgendwas;
    dynArray2: array of TIrgendwas;
begin

Luckie 7. Mär 2010 11:15

Re: dynamische Array kopieren (letztes Element fehlt)
 
Nein, sind sie nicht.
Delphi-Quellcode:
type
  TMyDynArray = array of Integer;

var
  dynarray1: TMyDynArray;
  dynarray2: TMyDynArray;
Jetzt sind sie vom gleichen Typ.

himitsu 7. Mär 2010 11:17

Re: dynamische Array kopieren (letztes Element fehlt)
 
Delphi ist da sehr strikt und es sind zwar ähnliche, aber nicht die selben Typen.

Delphi-Quellcode:
var dynArray1, dynArray2: array of TIrgendwas;
Delphi-Quellcode:
type TIrgendwasArray = array of TIrgendwas;
var dynArray1, dynArray2: TIrgendwasArray;
Delphi-Quellcode:
type TIrgendwasArray = array of TIrgendwas;
var dynArray1: TIrgendwasArray;
  dynArray2: TIrgendwasArray;

samso 7. Mär 2010 11:25

Re: dynamische Array kopieren (letztes Element fehlt)
 
Der Befehl copy kopiert meines Wissens nicht von x bis y sondern ab x soundsoviel Elemente. Also müsste es
Delphi-Quellcode:
dynArray2 := Copy(dynArray1, 0, Length(dynArray1));
lauten, damit alle Elemente kopiert werden, oder?

Luckie 7. Mär 2010 11:33

Re: dynamische Array kopieren (letztes Element fehlt)
 
Nicht Length()-1?

brainless 7. Mär 2010 11:35

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

Zitat von samso
Der Befehl copy kopiert meines Wissens nicht von x bis y sondern ab x soundsoviel Elemente. Also müsste es
Delphi-Quellcode:
dynArray2 := Copy(dynArray1, 0, Length(dynArray1));
lauten, damit alle Elemente kopiert werden, oder?

jap das stimmt ;)
aber selbst wenn ich High(...)+1 nehme (was ja dann das selbe wie Length(...) ist, fehlt das letzte Element

-----

ich dachte immer, dass das:
var dynArray1, dynArray2: TIrgendwasArray;
das selbe wie das ist:
dynArray1: array of TIrgendwas;
dynArray2: array of TIrgendwas;

:o

okay wenn ich jetzt
Delphi-Quellcode:
dynArray2 := dynArray1;
benutze, sind alle dynArrayX[i].textinhalt aufeinmal leer? :?

Edit: hmm habe 1 und 2 verwechselt .. okay danke es klappt :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Seite 1 von 3  1 23      

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