AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi dynamische Array kopieren (letztes Element fehlt)
Thema durchsuchen
Ansicht
Themen-Optionen

dynamische Array kopieren (letztes Element fehlt)

Ein Thema von brainless · begonnen am 7. Mär 2010 · letzter Beitrag vom 26. Sep 2018
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

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

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 12:37
Length(arr)-1 = High(arr) ... bei einem dynamischem Array

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

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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von brainless
brainless

Registriert seit: 7. Mär 2010
Ort: Fürstenwalde / Cottbus
6 Beiträge
 
Delphi 7 Personal
 
#12

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 12:38
edit
~.~ mfg
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#13

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 12:42
Man iteriert über alle eingebauten Delphi-Arrays, egal ob statisch, dynamisch, offen oder sonstwie, per Low(arr) to High(arr) , und schon passt's.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 12:49
Zitat von uligerhardt:
Man iteriert über alle eingebauten Delphi-Arrays, egal ob statisch, dynamisch, offen oder sonstwie, per Low(arr) to High(arr) , und schon passt's.
Delphi-Quellcode:
//var el: telement;
// arr: array of telement;

for el in arr do
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#15

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 12:55
Zitat von himitsu:
Delphi-Quellcode:
//var el: telement;
// arr: array of telement;

for el in arr do
Oder so - hab ich ganz vergessen.
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#16

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 13:38
Mit
dynArray2 := dynArray1; wird aber nur die Referenz kopiert. Wenn man nun
  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.
  Mit Zitat antworten Zitat
Benutzerbild von brainless
brainless

Registriert seit: 7. Mär 2010
Ort: Fürstenwalde / Cottbus
6 Beiträge
 
Delphi 7 Personal
 
#17

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 14:18
Zitat von samso:
Mit
dynArray2 := dynArray1; wird aber nur die Referenz kopiert. Wenn man nun
  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

Edit: ich weiß nicht, wo der Fehler war.. aber jetzt funktioniert es auf einmal mit dynArray2 := Copy(dynArray1, 0, High(dynArray1) + 1); (danke allen)
~.~ mfg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: dynamische Array kopieren (letztes Element fehlt)

  Alt 7. Mär 2010, 15:00
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
kann nicht sein, denn dieses kopiert alles.

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

dynArray2 := Copy(dynArray1, 0, Length(dynArray1)); oder eben
dynArray2 := Copy(dynArray1);
$2B or not $2B
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#19

AW: dynamische Array kopieren (letztes Element fehlt)

  Alt 25. Sep 2018, 14:55
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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#20

AW: dynamische Array kopieren (letztes Element fehlt)

  Alt 25. Sep 2018, 15:09
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;
Uli Gerhardt

Geändert von uligerhardt (25. Sep 2018 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 06:34 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