AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

Ein Thema von s.h.a.r.k · begonnen am 6. Mai 2011 · letzter Beitrag vom 9. Mai 2011
Antwort Antwort
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#1

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 09:44
Habe es jetzt mal so gebaut, in der Hoffnung, dass es bei großen Arrays schneller ist als mein obiger Code: [...]
Da werden die Parameter StartIndex und Count aber nicht ausgewertet


(Von einem C-Compiler für Mikrocontroller bin ich es gewöhnt, dass der oft scheiße baut. Z.B. wenn man eine Variable hinzufügt. Fügt man noch eine hinzu, dann geht es wieder.)
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 09:51
Ist deine Instanz von TApDynamicArray vielleicht gar nicht initialisiert?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 09:58
Records haben keine Instanzen.

Gut, es kommt jetzt noch darauf an, welche Typen er innerhalb seines Records verwendet,
aber Vieles wird ja von Delphi automatisch initialisiert. Vorallem dann, wenn Dieses für eine korrekte (automatisch) Speicherverwaltung nötig ist.

Für normale dynamische arrays gibt es aber auch shcon eine Clone-Funktion ... die nennt sich Copy :stipid:

MeinKlon := Copy(DasOriginalArray);
Delphi-Quellcode:
var a, b, c: array of Integer;

SetLength(a, 1);
a[0] := 123456789;
b    := a;
b[0] := 666;
c    := Copy(a);
c[0] := 987654321;
ShowMessage(Format('%d %d %d', [a[0], b[0], c[0]])); // 666 666 987654321
(normale dynamische arrays haben zwar eine Referenzzählung, aber keine prüfung, beim Schreibzugriff )

Genauso, wie man neuerdings den letzen Parameter weglassen kann,
kann man schon sehr lange alle Index-Parameter weglassen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Mai 2011 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 10:01
oh, da hatte ich zu flüchtig hingeschaut. Hab das "record" bei der Declaration übersehen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 10:17
Hm... Ich würde behaupten Delphi verschlampt die TypInfos irgendwo. Denn die System.Copy() läuft direkt in die _DynArrayCopyRange() rein und darin wird dann die Exception geworfen, d.h. die TypInfos fehlen imho von vorn herein. Dann muss ich wohl mit meinem Workaround leben, obwohl mich sowas ungemein nerv... Aber sonst hätten die Embarcadero-Mitarbeiter ja nichts mehr zu fixen.

@himitsu: Kennst du mehr solcher Probleme, dass TypInfos bei der Verwendung von Generics fehlen? Scheinst da ja recht gut auf dem Laufenden zu sein. Habe dieses nette Feature noch nicht so lange in Gebrauch.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 10:54
Nee, geziehlt fällt mir jetzt nix ein.

Bei Records mit Recordmetoden und den Records sleber als Result davon und zusammen mit nur einem Feld im Record (z.B. nur ein dyn. array oder ein Interface), gibt es einen Fehler in der Referenzzählung (wird zuoft freigegeben und dann knallts).

Enums und Sets, mit vordefinierten Werten (type e = (one, two=2, tree); ), besitzen keine Typinfos zu den Werten.

Und bei den Generics gibt es Fehler die nicht immer da sind. Irgendwo davor eine Leerzeile eingefügt und urplötzlich geht es u.Ä.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 11:01
Bei Records mit Recordmetoden und den Records sleber als Result davon und zusammen mit nur einem Feld im Record (z.B. nur ein dyn. array oder ein Interface), gibt es einen Fehler in der Referenzzählung (wird zuoft freigegeben und dann knallts).
Äh, nochmal langsam?! Ein Record mit Methoden, welcher auch noch ein Feld hat, am besten noch ein dynamisches Array? Also quasi sowas hier
Delphi-Quellcode:
TApDynamicArray<T> = record
private const
  DEFAULT_SEPARATOR = ';';
  DEFAULT_USE_BRACKETS = True;
  DEFAULT_BRACKETS_OPEN = '[';
  DEFAULT_BRACKETS_CLOSE = ']';
private type
  TDynamicArray = array of T;
private
  FData : TArray<T>;
  { Methoden }
public
  { Methoden }
  property Data[Index: Integer]: T read GetData write SetData; default;
  property Length: Integer read GetLength write SetLength;
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: Wann kann System.Copy(Array, Index, Count) eine Exception liefern?

  Alt 6. Mai 2011, 09:57
Habe es jetzt mal so gebaut, in der Hoffnung, dass es bei großen Arrays schneller ist als mein obiger Code: [...]
Da werden die Parameter StartIndex und Count aber nicht ausgewertet
Jo, schon gemerkt gehabt -- muss wohl am dem fehlenden Schlaf liegen. Man sollte einfach nicht die komplette nach durchcoden Trotzdem danke für den Hinweis!

(Von einem C-Compiler für Mikrocontroller bin ich es gewöhnt, dass der oft scheiße baut. Z.B. wenn man eine Variable hinzufügt. Fügt man noch eine hinzu, dann geht es wieder.)
Ist ja wie russisches Roulette So schön Optimierungen des Compilers auch sein mögen, es sollte aber doch möglichst funktionieren... Dann kann es ruhig einen kleinen Tick langsamer sein.

Habe mir jetzt auch mal die _DynArrayCopyRange angeschaut und siehe da, himitsu hatte recht.
Aber in Verbindung mit der RTTI vermute ich jetzt einfach mal, daß Die Generics da irgendwo Mist bauen (wie immer),
denn daraus werden ja die Informationen über den Aufbau der Daten geholt und damit auch über die Methode des Kopierens, bzw. die Speicherverwaltung.
An der Adresse, auf die zugegriffen wird, sollten eigentlich Typinformationen stehen, allerdings läuft da irgendwas ziemlich schief. Mal schauen, ob es nicht noch eine Rettung für den Spass gibt. Der Umstand der Kombination aus diesem netten Problem und der Position der Methode innerhalb der Methoden-Deklarationen, ist aber echt genial
Ist deine Instanz von TApDynamicArray vielleicht gar nicht initialisiert?
Ich denke, dass ich nicht mehr als das hier benötige, da es sich um einen record handelt, nicht um eine Klasse:
Delphi-Quellcode:
var
  A : TApDynamicArray<Integer>;
begin
  try
    // Some basics
    TTest.Print(A); // -> []
    SetLength(Tmp, 2);
    A := Tmp;
    TTest.Print(A); // -> [0;0]
    TTest.SetUnsortedData(A); // -> Setzt die Länge auf 10 und füllt das Array
    TTest.Sort(A); // <- in der Method wird Clone aufgerufen -> Exception
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:14 Uhr.
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