Array mit Namen statt Ziffern als Index

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
GummiQ
Beiträge: 4
Registriert: Mo 17. Apr 2023, 13:45

Array mit Namen statt Ziffern als Index

Beitrag von GummiQ »

Hallo Gemeinde,

ich stehe im Moment iwi total auf dem Schlauch, wahscheinlich sehe ich den Wald vor lauter Bäumen nicht.
Ich lese einen kleinen Apparat aus und bekomme div. Hexwerte, die den Zuatand der Ein-/Ausgänge repräsentiert.
Diese verwende ich weiter.
Um den Zugriff einfach zu gestalten, wollte ich die 12 Stati in eine Art "Array of boolen" packen.
Zugriff sollte dann in etwas so erfolgen:
If IO.Ready = true then...
If IO.Sel1 = false then...

Ich finde im Moment einfach nicht den richtigen Ansatz, dass Array nicht über den Index, also z.B. io[2] anzuprechen,
sondern über die "Klartextnamen". Ich habe es auch schon mit einem Record versucht (Name: string, Wert : boolean)
und davon einen Array gemacht, aber da muss ich dann ja nach der Zuweisung des Namens (IO[7].Name:= 'Ready';)
trotzdem wieder den Index angeben, um den Wert abzufragen, also: if IO[7].wert = true then...

Danke im Voraus
Michael

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Array mit Namen statt Ziffern als Index

Beitrag von corpsman »

Dein beispiel deutet aber eine Struktur an.

so ginge es via Array

Code: Alles auswählen

Type
TIrgendwas = (Ready, sel1, sel2);

var
 io:Array[TIrgendwas ] of boolean;

begin
io[Ready] := true;

--
Just try it

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Array mit Namen statt Ziffern als Index

Beitrag von siro »

Code: Alles auswählen

program Project1;

{$R *.res}
type Statis =(Stati_1,Stati_noch_einer, Stati_bla,Stati_x,nochwas, und_dieser);

  var io:Array[Statis] of Boolean;


begin
  io[Stati_bla]:=TRUE;
  io[und_dieser]:=FALSE;
end.
               
ich sehe grade Corpsman war schneller :wink:
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Array mit Namen statt Ziffern als Index

Beitrag von Warf »

Wenn es dynamisch sein muss, musst du eine Map/Dictionairy nutzen.

Code: Alles auswählen

uses
  Generics.Collection;
  
type
  TStringBoolMap = specialize TDictionary<String, Boolean>;

var
  map: TStringBoolMap;
begin
  map := TStringBoolMap.Create;
  try
    // Einträge erstellen
    map.Add('Key1', False);
    map.Add('Key2', False);
    map.Add('Key3', False);
    
    // Einträge nutzen
    if map['Key1'] then
      WriteLn('Key1 ist True');
    // Überprüfen ob ein Key in der Map ist
    if map.ContainsKey('Key3') then
      map['Key3'] := True;
  finally
    Free;
  end;
end.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Array mit Namen statt Ziffern als Index

Beitrag von corpsman »

@warf
kannst du zufällig TFPGMap und TDictionary gegeneinander abgrenzen ?

Code: Alles auswählen

type
  TStringBoolMap = specialize TFPGMap <String, Boolean>;  
vs
  TStringBoolMap = specialize TDictionary<String, Boolean>;
--
Just try it

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Array mit Namen statt Ziffern als Index

Beitrag von theo »

corpsman hat geschrieben:
Mi 17. Mai 2023, 12:53
@warf
kannst du zufällig TFPGMap und TDictionary gegeneinander abgrenzen ?

Code: Alles auswählen

type
  TStringBoolMap = specialize TFPGMap <String, Boolean>;  
vs
  TStringBoolMap = specialize TDictionary<String, Boolean>;
Der Unterschied ist wohl hauptsächlich historisch bedingt.
FPC hatte früher Generics Support als Delphi, aber jetzt halt auch noch den Dialekt von Delphi
https://wiki.freepascal.org/Generics

Ich glaube die funktionieren fast gleich.
S.a. https://forum.lazarus.freepascal.org/in ... ic=61460.0

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Array mit Namen statt Ziffern als Index

Beitrag von Warf »

Generics.Collections ist Delphi Kompatibel. Außerdem ist es eine insich konsistente Biliothek. So implementieren die Klassen untereinander die IEnumerable Interfaces, was z.B. den vorteil hat das du ne Map direkt aus einer Liste mit Tupeln erstellen kannst und anders rum. Oder du kannst auch ganz einfach HashSets in Listen Konvertieren, und generell ist Generics.Collections einfach ein bisschen Vielseitiger.

FGL macht was es soll, aber Generics.Collections bietet oft einfach mehr Komfortfeatures.

GummiQ
Beiträge: 4
Registriert: Mo 17. Apr 2023, 13:45

Re: Array mit Namen statt Ziffern als Index

Beitrag von GummiQ »

Hallo zusammen,

vielen Dank für Eure Antworten.

Code: Alles auswählen

Type
TIrgendwas = (Ready, sel1, sel2);
var
 io:Array[TIrgendwas ] of boolean;
begin
io[Ready] := true;
Reicht für meine Bedürfnisse schon vollkommen aus.

Wünsche Allen einen guten Start in die Woche

Antworten