Einzelnen Beitrag anzeigen

Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
479 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Weitergabe von mehrfach Array, wie?

  Alt 4. Jul 2019, 06:10
Naja, bedingt. "array of Extended" funktioniert leider auch nur sehr bedingt. Im Rückgabewert der Funktion beispielsweise nämlich nicht.
Der Grund, warum das so nicht funktioniert ist, dass es im Grunde (obwohl ähnlich bzw gleich deklariert) drei Arten von Arrays für den Compiler gibt:
  1. Statische Arrays, die auf dem Stack abgelegt werden können, da ihre Größe zur Kompilierzeit bereits feststeht
  2. (Einfache) dynamische Arrays, deren Größe bei der Erzeugung festgelegt wird und die somit auf dem Heap gespeichert werden müssen; sie verhalten sich ähnlich wie Zeiger auf statische Arrays mit der besonderheit, dass sie selber die Eigenschaften eines Arrays (Referenzzählung, Typpenprüfung, ...) besitzen
  3. (Offene) Parameter-Arrays, die zwar immer dynamisch sein müssen, dafür aber auch "untypisiert" sein dürfen*

*was sie natürlich nur "scheinbar" sind. (In Wahrheit sind es offene arrays von TVarRec-Objekten)

Offene Arrays sind nicht exakt das gleiche wie dynamische Arrays und somit auch nur teilweise kompatibel. Die Konvertierung von einem dynamischen Array in ein offenes Array verläuft bei der Parameterübergabe implizit.
Offene Arrays müssen eindimensional sein. Es sind intern keine "arrays" sondern Zeiger auf Records, in denen der Zeiger auf das erste Element, sowie die Länge gespeichert ist. Hier sind wir auch schon bei dem Haken: Es gibt keinen Support für die Dimensionen.
Wenn du gezielt willst, dass keine offenen Arrays erzeugt werden, sondern echte (dynamische) arrays übergeben werden, dann musst du einen expliziten Typen dafür deklarieren. Bei "array of Extended" denkt der Compiler, du wolltest einen offenen Array-Parameter deklarieren. Bei "TArray<Extended>" oder "TExtendedArray" weiß er, dass es dieser spezifische Typ sein soll (nämlich ein dynamisches Array mit Extended-Werten). Beim Funktions-Ergebnistyp versucht er dies auch, allerdings können offene Arrays nicht zurückgegeben werden, weshalb er einen Fehler anzeigt. Hier müsstest du immer den Alias benutzen.

Entschuldigung, falls ich dich verwirrt habe. Nur, falls es dich im Detail interessiert, warum das so nicht geht.
Dennis
  Mit Zitat antworten Zitat