Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konstanten-Array ist nicht konstant (https://www.delphipraxis.net/206015-konstanten-array-ist-nicht-konstant.html)

darktrym 10. Nov 2020 09:39

Delphi-Version: 10.2 Tokyo

Konstanten-Array ist nicht konstant
 
Eigentlich sollte das recht trivial sein aber der Compiler meldet stets das folgendes Konstrukt nicht konstant (genug) ist und deshalb im Case-Block nicht verwendet werden kann:

Delphi-Quellcode:
type
  tMfc_MessageTypes = (MMT_None{=0}, MMT_PalletComplete{=90}, MMT_Inserted{=100});
  tMfc_MessageTypeArray = array[tMfc_MessageTypes] of integer;
const
  cMfc_MessageTypes: tMfc_MessageTypeArray = (0, 90, 100);
Der Zugriff erfolgt dann via:

Delphi-Quellcode:
Case x of
cMfc_MessageTypes[MMT_Inserted]: y;
end;
Wie erstelle ich nun einen Konstanten-Array?

jaenicke 10. Nov 2020 09:54

AW: Konstanten-Array ist nicht konstant
 
Meinst du vielleicht so etwas?
Delphi-Quellcode:
var
  x: Integer;
begin
  Case x of
    Byte(MMT_Inserted): ;
  end;
Du musst den Typ ohne Umwandlung durch ein Array angeben. Entweder so oder mit expliziten Konstanten oder ähnlichem.

Das Mapping der Integerwerte musst du vorher selbst über das Array machen oder die Werte MMT_Inserted direkt in der Deklaration zuweisen (wie du es ja auskommentiert schon drin hast).

Papaschlumpf73 10. Nov 2020 09:59

AW: Konstanten-Array ist nicht konstant
 
Ohne jetzt auf dein speziellen Fall Rücksicht zu nehmen. Hier ein Beispiel für ein const String-Array

const
MyArray: array[0..2] of String=(
('String0'),
('String1'),
('String2'));

Das kannst du bestimmt adaptieren...

jaenicke 10. Nov 2020 15:42

AW: Konstanten-Array ist nicht konstant
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1477003)
Ohne jetzt auf dein speziellen Fall Rücksicht zu nehmen. Hier ein Beispiel für ein const String-Array

Das ändert doch an dem Problem nichts. Auch damit gibt es kein automatisches Mapping auf einen anderen Integerwerts als den in der Enumeration selbst den Werten zugewiesene. Das ist aber auch nicht in der Form möglich.

himitsu 10. Nov 2020 16:36

AW: Konstanten-Array ist nicht konstant
 
Entweder
Delphi-Quellcode:
if x = cMfc_MessageTypes[MMT_Inserted] then y else if ...


oder du mußt eben dort Konvertieren, wo du keine Konstante brauchst.
Delphi-Quellcode:
case cMfc_IntToMessageTypes(x) of
  MMT_Inserted: y;
end;
Ginge als Funktion oder als Array
Delphi-Quellcode:
tMfc_MessageTypeArray = array[Byte] of tMfc_MessageTypes;
, nur hat dann dein Array natürlich viele Lücken, welche in der Array-Konstante dann mit irgendwas gefüllt werden müssten.
Wobei die Funktion auch das alte Array nutzen könnte, um darin den Wert zu suchen.

Papaschlumpf73 10. Nov 2020 16:45

AW: Konstanten-Array ist nicht konstant
 
Zitat:

Zitat von jaenicke (Beitrag 1477057)
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1477003)
Ohne jetzt auf dein speziellen Fall Rücksicht zu nehmen. Hier ein Beispiel für ein const String-Array

Das ändert doch an dem Problem nichts. Auch damit gibt es kein automatisches Mapping auf einen anderen Integerwerts als den in der Enumeration selbst den Werten zugewiesene. Das ist aber auch nicht in der Form möglich.

Sorry, ich hatte nur die Frage gelesen:
"Wie erstelle ich nun einen Konstanten-Array?"

Ich muss mir einfach mal mehr Zeit nehmen...

himitsu 10. Nov 2020 17:30

AW: Konstanten-Array ist nicht konstant
 
Das Array ist zwar eine Konstante, aber auch nicht,
und dein Zugriff auf dieses Array
Delphi-Quellcode:
cMfc_MessageTypes[MMT_Inserted]
ist somit auch nicht konstant.

"typisierte" Konstanten sind eigentlich nur "schreibgeschützte" Variablen.

Delphi-Quellcode:
const
  A = 0; // "echte" Konstante
  B: Integer = 0; // Konstante (aber intern eine schreibgeschützte globale Variable)

{$IF A = 1} miep {$IFEND}
{$IF B = 1} mööp {$IFEND}


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 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