Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konstantes Array of Record deklarieren (https://www.delphipraxis.net/217463-konstantes-array-record-deklarieren.html)

himitsu 10. Jul 2025 11:58

AW: Konstantes Array of Record deklarieren
 
Auch das Thema mehrere Entwickler und Mergen, spielt gern eine Rolle.

Zwei Kollegen fügen je eine "Zeile" / Eintrag hinzu, dann müssten sie ja, bei einem statischen Array die Größe definieren, was sich nach dem Merge aber wiederspricht.

Stevie 10. Jul 2025 12:02

AW: Konstantes Array of Record deklarieren
 
Zitat:

Zitat von freimatz (Beitrag 1550076)
ich verstehe noch nicht, wieso das überhaupt gehen sollte. Für mich ist "konstant" und "dynamisch" ein Widerspruch.
Wenn es eine Konstante sein soll, dann kann man doch auch ein festes Arry machen - oder nicht?

"Konstant" und "Dynamisch" sind hier wohl die falschen Worte - es geht eher darum, dass es kein "fixed-size" Array ist und somit auch potenziell zuweisungskompatibel zu einer
Delphi-Quellcode:
array of T
oder
Delphi-Quellcode:
TArray<T>
Variablen oder Parameter.

Die Technik hinter einem "konstanten dynamischen" Array ist dieselbe, wie bei einem konstanten String bzw Stringliteral - der Compiler legt dadurch, dass er -1 in das RefCount Feld schreibt, fest, dass es sich um eine "Konstante" handelt, von der in bestimmten Fällen eine Kopie gemacht werden muss.

Zitat:

Zitat von Uwe Raabe (Beitrag 1549960)
So sollte es gehen

Nein,
Delphi-Quellcode:
E2026 Constant expression expected

Dennis07 10. Jul 2025 12:24

AW: Konstantes Array of Record deklarieren
 
Zitat:

Zitat von freimatz (Beitrag 1550076)
Hallo,
ich verstehe noch nicht, wieso das überhaupt gehen sollte. Für mich ist "konstant" und "dynamisch" ein Widerspruch.
Wenn es eine Konstante sein soll, dann kann man doch auch ein festes Arry machen - oder nicht?

Das Gegenteil von konstant ist variabel.
Das Gegenteil von statisch ist dynamisch.

Zumindest in dieser Konstellation, und es ist wichtig, dass du genau darauf achtest. Es gibt folgende Konstellationen:
  • statische Array-Konstanten:
    Delphi-Quellcode:
    const A: array [0..1] of Byte = (-128, 127)
  • dynamische Array-Konstanten:
    Delphi-Quellcode:
    const A: array of Byte = [-128, 127]
  • statische Array-Variablen:
    Delphi-Quellcode:
    var A: array [0..1] of Byte
  • dynamische Array-Variablen:
    Delphi-Quellcode:
    var A: array of Byte

Der einzige Unterschied für den Programmierer ist, dass du bei dynamischen Arrays keine Länge angeben brauchst, sondern diese automatisch gesetzt wird (damals brauchte man
Delphi-Quellcode:
SetLength
, das geht heute aber auch ohne):
Delphi-Quellcode:
var
  A: array of Byte;
begin
  // früher:
  // SetLength(A, 2);
  // A[0] := -128;
  // A[1] := 127;
  // oder, falls man einen Typen hatte:
  // A := TBytes.Create(-128, 127);
  // Braucht man heute alles nicht mehr, einfach:
  A := [-128, 127];
end;
Genau das gleiche trifft auch auf die Konstanten zu: Hier ist der einzige Unterschied, dass du keine explizite Längenangabe in der Deklaration mehr brauchst.*

*) Und noch ein paar Unterschiede in der Speicherverwaltung, aber die sind jetzt mal egal.

Hinzu kommt noch ein Sonderfall: Dynamische Array-Inline-Konstanten. Darauf wollte ich jetzt eigentlich nicht eingehen, aber weil es anscheinend doch noch zu einer belebten Diskussion gekommen ist, hier mal ein Lösungsansatz:
Delphi-Quellcode:
type
  TKameraTypRec = record
    Name: string;
    Breite: Integer;
    Hoehe: Integer;
    PixelSizeX: Extended;
    PixelSizeY: Extended;
    // Implementierung der Factory-Methode dürfte selbsterklärend sein:
    class function Create(const AName: String; const ABreite, AHoehe: Integer; const APixelsSizeX, APixelsSizeY: Extended): TKameraTypRec; static;
    // Du kannst natürlich stattdessen auch eine globale Routine nehmen, ist ja das selbe wie eine statische Klassenfunktion
  end;

begin
  const CAM_TYPES: TKameraTypArr {Typen könntest du dank Inferenz sogar weglassen, lol} = [
    TKameraTypRec.Create('GT1920', 1920, 1080, 0.00000586, 0.00000586)
  ];
  // ...
end.
So geht das theoretisch. Ob es jetzt geiler ist als da eben eine Länge vor zu schreiben muss jeder für sich selbst entscheiden.

Uwe Raabe 10. Jul 2025 13:32

AW: Konstantes Array of Record deklarieren
 
Zitat:

Zitat von Stevie (Beitrag 1550073)
Zitat:

Zitat von dummzeuch (Beitrag 1549959)
Ich will ein dynamisches Array von Records als Konstante deklarieren.

Geht nicht, weil

Yo, den hatte ich ganz vergessen. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.
Seite 2 von 2     12   

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