AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Variable für const array

Ein Thema von Benmik · begonnen am 1. Okt 2017 · letzter Beitrag vom 6. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2   
Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#1

Variable für const array

  Alt 1. Okt 2017, 17:00
Ich habe mehrere Arrays eines selbst definiertes Typs, die als Konstanten deklariert sind.
Je nach Bedarf möchte ich eins der Arrays an eine Funktion verfüttern.

Es gelingt mir aber nicht, eine Variable zu definieren, der ich so ein konstantes Array zuweisen und dann als Parameter an die Funktion senden könnte, da eine solche Variable ja als dynamische Variable deklariert werden muss (die Länge ist ja je nach const array verschieden), aber die Arrays eben const sind, und das ist mit dem Compiler nicht zu machen.
Ich habe mir unter anderem dies hier zu Gemüte geführt, aber mein Problem löst das nicht. Auch mit Generics kriege ich das nicht hin.

Ich vermute mal stark, dass ihr das aus dem Ärmel schüttelt.

Übrigens geht es um eine Enumeration mit mehr als 256 Items, und ich möchte feststellen, ob ein bestimmtes Item dieser Enumeration in einem konstanten Subset vorhanden ist.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Variable für const array

  Alt 1. Okt 2017, 21:19
Ich vermute mal stark, dass ihr das aus dem Ärmel schüttelt.
Anscheinend nicht, denn bisher antwortete niemand.

Gib doch mal am besten ausreichend Quelltext preis und markiere die Zeile, in der der Compiler stehenbleibt, und gib auch die Compilermeldung mit an.

Das alles sagt mehr als tausend (Deiner) Wörter.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.015 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Variable für const array

  Alt 1. Okt 2017, 22:12
Ich habe keine Ahnung, wo das Problem sein soll, denn ich verwende derzeit konstante Arrays eines Records in meinem SVG-Interpreter, da für einen XPM-Interpreter auch X11-Farben benötigt werden:
Delphi-Quellcode:
type
  TColorName = record
    Color: TColor;
    Name: string;
  end;

function HTMLToColor(HTML: string; out Color: TColor; const ColorNames: array of TColorName): Boolean;

const
  CSSColors: array[0..146] of TColorName = ((Color: $00FFF8F0; Name: 'aliceblue'),
  (* here be 145 dragons *)
                                            (Color: $0032CD9A; Name: 'yellowgreen'));

implementation

begin
  HTMLToColor('rebeccapurple', tempcolor, CSSColors); // funktioniert einwandfrei
end;
Wenn's gar nicht anders geht: packed array s mit Pointern verwenden wie Windows das macht. Aber das sollte doch eigentlich ganz normal gehen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Variable für const array

  Alt 2. Okt 2017, 13:29
War natürlich ein Fehler, keinen Beispielcode mitzuliefern.
Delphi-Quellcode:
type
  TEnum =(eEins,eZwei,eDrei,eVier,eFünf,eSechs,eSieben,eAcht,eNeun,eZehn);
const
  Enum1 : array[0..4] of TEnum = (eEins,eDrei,eSechs,eSieben,eZehn);
  Enum2 : array[0..6] of TEnum = (eZwei,eVier,eFünf,eSechs,eAcht,eNeun,eZehn);

function IstDrin(VarE:TEnum;const AEnum:array of TEnum):Boolean;
var VEnum:TEnum;
begin
  Result := False;
  For VEnum in AEnum do
    If VEnum = VarE
      then exit(True);
end;

procedure MachWas(AEnumNr:integer);
var i:integer; AEnum:array of TVarEnum;
begin
  case AEnumNr of
    1 : AEnum := Enum1;
    2 : AEnum := Enum2;
  end;
  If IstDrin(eDrei,AEnum)
    then ... ;
end;
Der Knackpunkt ist AEnum := Enum1 . Der Compiler sagt (zu Recht), dass ein array[0..4] of TEnum nicht das Gleiche ist wie ein dynamisches Array von TEnum.
Ich suche eine Möglichkeit, die verschiedenen Enum1..Enum10 mit einer Variable an die Funktion zu übergeben.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Variable für const array

  Alt 2. Okt 2017, 13:34
emm...

Delphi-Quellcode:
Setlength(AEnum,length(Enum1))
For i:=0 to high(Enum1) do
  AEnum[i] := Enum1[i];
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Variable für const array

  Alt 2. Okt 2017, 13:49
Äh... das habe ich vornehm ausgelassen.
Die Möglichkeit ist mir schon bewusst.
Ich habe mich dummerweise darauf verbissen herauszukriegen, wie man diese Zuweisung hinbekommt.
Ich gestehe also, dass ich nicht ratlos bin, wie man das überhaupt macht, sondern dass ich nicht verstehe, wie man hier mit Delphi umgeht.
Schuld ist natürlich dieser elegante Code, der hier dauernd gepostet wird.
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
477 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Variable für const array

  Alt 2. Okt 2017, 13:51
Oder so, ich habe es aber nicht getestet...
Delphi-Quellcode:
type
  TEnum = (eEins, eZwei, eDrei, eVier, eFünf, eSechs, eSieben, eAcht, eNeun, eZehn);
  TEnumArray = array of TEnum;
  PEnumArray = ^TEnumArray;

const
  Enum1: array [0 .. 4] of TEnum = (eEins, eDrei, eSechs, eSieben, eZehn);
  Enum2: array [0 .. 6] of TEnum = (eZwei, eVier, eFünf, eSechs, eAcht, eNeun, eZehn);

function IstDrin(VarE:TEnum;const AEnum: TEnumArray):Boolean;
var VEnum:TEnum;
begin
  Result := False;
  For VEnum in AEnum do
    If VEnum = VarE
      then exit(True);
end;

procedure MachWas(AEnumNr:integer);
var
AEnum: PEnumArray;
begin
  case AEnumNr of
    1 : AEnum := @Enum1;
    2 : AEnum := @Enum2;
    else
      Exit;
  end;
  If IstDrin(eDrei,AEnum^)
    then ;
end;
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.980 Beiträge
 
Delphi 12 Athens
 
#8

AW: Variable für const array

  Alt 2. Okt 2017, 14:07
Zumindest in Berlin/Tokyo kannst du es so machen:
Delphi-Quellcode:
type
  TEnum = (eEins, eZwei, eDrei, eVier, eFünf, eSechs, eSieben, eAcht, eNeun, eZehn);

  TEnumArr = TArray<TEnum>;

const
  Enum1: TEnumArr = [eEins, eDrei, eSechs, eSieben, eZehn];
  Enum2: TEnumArr = [eZwei, eVier, eFünf, eSechs, eAcht, eNeun, eZehn];

function IstDrin(VarE: TEnum; const AEnum: TEnumArr): Boolean;
var
  VEnum: TEnum;
begin
  Result := False;
  For VEnum in AEnum do
    If VEnum = VarE then
      exit(True);
end;

procedure MachWas(AEnumNr: integer);
var
  i: integer;
  AEnum: TEnumArr;
begin
  case AEnumNr of
    1:
      AEnum := Enum1;
    2:
      AEnum := Enum2;
  end;
  If IstDrin(eDrei, AEnum) then;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Variable für const array

  Alt 2. Okt 2017, 14:16
Mit dem Pointer finde ich auch nicht so schön...

Enum1 und Enum2 sind ja wie globale Variablen...

Also warum nicht auch so benutzen...

Delphi-Quellcode:
Enum1,
Enum2 : Array of TEnum;

Procedure Init
begin
  Enum1 := [eEins, eDrei, eSechs, eSieben, eZehn];
  Enum2 := [eZwei, eVier, eFünf, eSechs, eAcht, eNeun, eZehn] ;
end;
Müsste doch auch gehen... Hab gerade keinen Compiler...
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Variable für const array

  Alt 2. Okt 2017, 14:36
@BerndS:
Auf die Zeigeridee war ich auch schon gekommmen, konnte es aber nicht umsetzen.
Dies hier funktioniert auch nicht.
Zum einen geht For..in nicht, was nicht weiter schlimm ist.
Aber in AEnum^ steht nur Unsinn, tausend Werte, alle außerhalb des Bereichs?
Warum ist das so?

@Uwe:
Und auch das hatte ich probiert. Ich hoffe, ich habe jetzt keinen Flüchtigkeitsfehler begangen, aber der Compiler sagt bei AEnum := Enum1; : "Inkompatible Typen: TArray<TEnum> und array[0..4] of TEnum.


Haaaalt, alles zurück! Ich hatte das Enum1: TEnumArr = [eEins, eDrei, eSechs, eSieben, eZehn]; nicht angepasst!
So geht es. Wie konnte ich daran zweifeln.
Danke!

Geändert von Benmik ( 2. Okt 2017 um 14:59 Uhr)
  Mit Zitat antworten Zitat
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 15:45 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