Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Projektplanung und -Management (https://www.delphipraxis.net/85-projektplanung-und-management/)
-   -   System.Generics.Collections.TArray.Copy (https://www.delphipraxis.net/182886-system-generics-collections-tarray-copy.html)

Der schöne Günther 24. Nov 2014 09:47

System.Generics.Collections.TArray.Copy
 
Ich bin zu dumm dafür. Wie ist das gemeint? Doku ist natürlich keine vorhanden.

Delphi-Quellcode:
var
   firstArray, secondArray: TArray<Integer>;
begin
   firstArray := [5,4,3,2,1];
   SetLength(secondArray, Length(firstArray));
   TArray.Copy(firstArray, secondArray, Length(firstArray));
Ich finde, das ist richtig. Tatsächlich wirft er mir aber eine
Delphi-Quellcode:
EArgumentOutOfRangeException
-Exception um die Ohren denn in
System.Generics.Collections.pas steht:

Delphi-Quellcode:
class procedure TArray.CheckArrays(Source, Destination: Pointer; SourceIndex, SourceLength, DestIndex, DestLength, Count: NativeInt);
begin
  if (SourceIndex < 0) or (DestIndex < 0) or (SourceIndex >= SourceLength) or (DestIndex >= DestLength) or
     (SourceIndex + Count >= SourceLength) or (DestIndex + Count >= DestLength) then
    raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);
  if Source = Destination then
    raise EArgumentException.CreateRes(@sSameArrays);
end;
Warum ist es denn ungültig wenn SourceIndex + Count >= SourceLength sind? Das muss doch so sein. Wenn ich ein Array mit fünf Elementen kopieren will- Dann ist doch Index = 0, Count = 5 und Length = 5.

Ich finde, er müsste auf ">" prüfen und nicht ">="



Wo ist mein Denkfehler?

himitsu 24. Nov 2014 09:53

AW: System.Generics.Collections.TArray.Copy
 
Copy?
Meinst du nicht eher
Delphi-Quellcode:
TArray.Copy<Integer>
Zitat:

Delphi-Quellcode:
class procedure Copy<T>(const Source, Destination: array of T; SourceIndex, DestIndex, Count: NativeInt); overload; static;
class procedure Copy<T>(const Source, Destination: array of T; Count: NativeInt); overload; static;

Auch wenn ich die OH ein bissl eigenartig finde, denn einer der Array (Dest) sollte doch VAR sein. :gruebel:


Aber ja, > wäre da wohl besser.

Code:
0123456789
   *******

(SourceIndex + Count >= SourceLength)
(3 + 7 >= 10) = True

PS: Dein Beispiel kann man auch mit den alten Funktionen umsetzen.
Delphi-Quellcode:
firstArray := [5,4,3,2,1];
secondArray := Copy(firstArray);
Und gab es nicht auch eine Insert-Funktion im TArray?

Sir Rufo 24. Nov 2014 10:25

AW: System.Generics.Collections.TArray.Copy
 
Da sind zwei Fehler den ich schon gemeldet habe ...

https://quality.embarcadero.com/browse/RSP-9620
https://quality.embarcadero.com/browse/RSP-9622

Der schöne Günther 24. Nov 2014 10:43

AW: System.Generics.Collections.TArray.Copy
 
Danke! Scheint aber nicht so wichtig zu sein da die Tickets noch nicht einmal jemandem zugewiesen sind. Ich meine, Arrays kopieren. Wer tut das schon.

Ich weiß immer nicht, ob ich mich freuen oder weinen soll wenn man sieht dass der Fehler nicht im eigenen Kopf, sondern im Embarcadero Sourcecode steckt :-D

himitsu 24. Nov 2014 11:32

AW: System.Generics.Collections.TArray.Copy
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1280888)
Ich meine, Arrays kopieren. Wer tut das schon.

Dabei wurde es doch als eines DER Features angepriesen, weswegen man das neue Delphi kaufen sollte ... Also dann sollte es auch besser mal funktionieren. :roll:

Ohne eingelogt zu sein, kann man das ja nun nichmal mehr lesen. :wall:

Uwe Raabe 24. Nov 2014 12:04

AW: System.Generics.Collections.TArray.Copy
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1280879)
Ich finde, das ist richtig. Tatsächlich wirft er mir aber eine
Delphi-Quellcode:
EArgumentOutOfRangeException
-Exception um die Ohren denn in
System.Generics.Collections.pas steht:

Delphi-Quellcode:
class procedure TArray.CheckArrays(Source, Destination: Pointer; SourceIndex, SourceLength, DestIndex, DestLength, Count: NativeInt);
begin
  if (SourceIndex < 0) or (DestIndex < 0) or (SourceIndex >= SourceLength) or (DestIndex >= DestLength) or
     (SourceIndex + Count >= SourceLength) or (DestIndex + Count >= DestLength) then
    raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);
  if Source = Destination then
    raise EArgumentException.CreateRes(@sSameArrays);
end;

Das steht in meinem XE7 aber anders da:

Delphi-Quellcode:
class procedure TArray.CheckArrays(Source, Destination: Pointer; SourceIndex, SourceLength, DestIndex, DestLength, Count: NativeInt);
begin
  if (SourceIndex < 0) or (DestIndex < 0) or (SourceIndex >= SourceLength) or (DestIndex >= DestLength) or
     (SourceIndex + Count > SourceLength) or (DestIndex + Count > DestLength) then
    raise EArgumentOutOfRangeException.CreateRes(@SArgumentOutOfRange);
  if Source = Destination then
    raise EArgumentException.CreateRes(@sSameArrays);
end;

Der schöne Günther 24. Nov 2014 12:09

AW: System.Generics.Collections.TArray.Copy
 
Jetzt bin ich verwirrt. Ich stehe weiterhin zu meinem Wort, meine XE7 System.Generics.Collections.pas enthält genau das! Enterprise und Architect sollten sich doch hier nicht unterscheiden?
In der Fixlist für XE7.1 finde ich auch nichts passendes.


Größe: 72.436 Bytes
Embarcadero® RAD Studio XE7 Version 21.0.17017.3725
Enterprise

himitsu 24. Nov 2014 12:19

AW: System.Generics.Collections.TArray.Copy
 
Zitat:

Delphi-Quellcode:
if Source = Destination then

Man darf die Funktionen nicht verwenden, um Daten innerhalb eines Arrays umukopieren?

Das ist aber blöd.

Union 24. Nov 2014 12:22

AW: System.Generics.Collections.TArray.Copy
 
@Uwe, bei Build 21.0.17017.3725 war es aber noch die vom OP genannte Variante. Du hast sicher Update 1 bereits installiert. Allerdings ist diese Änderung nicht in den Release notes.

Uwe Raabe 24. Nov 2014 12:24

AW: System.Generics.Collections.TArray.Copy
 
Zitat:

Zitat von Union (Beitrag 1280908)
@Uwe, bei Build 21.0.17017.3725 war es aber noch die vom OP genannte Variante. Du hast sicher Update 1 bereits installiert. Allerdings ist diese Änderung nicht in den Release notes.

Vermutlich ist es so, daß der Fix in Update 1 enthalten ist. Im Moment kann ich das auch nicht kontrollieren.

Man kann sich vielleicht doch nicht immer auf die Vollständigkeit der Bugfix-Liste verlassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Seite 1 von 2  1 2      

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