record mit case

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 7069
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

record mit case

Beitrag von Mathias »

Ich habe da 2 fast gleiche Deklarationen.

Code: Alles auswählen

type
  TRec0 = record
    case byte of  // byte
      0: ();
      1: (a: byte);
      2: (b: word);
  end;

  TRec1 = record
    case Test: byte of  // Test: byte
      0: ();
      1: (a: byte);
      2: (b: word);
  end;
Was ist der Unterschied zwischen den beiden Deklarationen ?
Was hat dies weiter unten für einen Einfluss ?

Was macht "0: ();" für einen Sinn ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: record mit case

Beitrag von theo »

1: Steht ja in dem Link von vorhin: https://www.freepascal.org/docs-html/ref/refsu15.html
"The optional identifier in the case statement serves to access the tag field value, which otherwise would be invisible to the programmer. It can be used to see which variant is active at a certain time. In effect, it introduces a new field in the record. "
"However, it is up to the programmer to maintain this field. "
2. Weiss auch nicht. Das scheint mir in diesem Fall nicht sinnvoll.

PascalDragon
Beiträge: 997
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: record mit case

Beitrag von PascalDragon »

Mathias hat geschrieben: Sa 24. Feb 2024, 14:27 Was macht "0: ();" für einen Sinn ?
Du kannst damit zeigen, dass es Varianten des Records gibt, welches keine weiteren Felder hat. Nimm zum Beispiel das Folgende an:

Code: Alles auswählen

type
  TType = (tEmpty, tLongInt, tBoolean);

  TRec = record
    case t: TType of
      tEmpty: ();
      tLongInt: (l: LongInt);
      tBoolean: (b: Boolean);
  end;
Es kommt eben immer auf den jeweiligen Usecase an, ob das sinnvoll ist.
FPC Compiler Entwickler

Mathias
Beiträge: 7069
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: record mit case

Beitrag von Mathias »

Ich habe da noch etwas merkwürdiges entdeckt, was noch zum Thema passt.

Wieso wird dieser Code anstandslos kompiliert ?
Man beachte das 1: .

Code: Alles auswählen

type
  TTest1 = record
    case longint of
      1: (i: integer);
      1: (f: single);
      1: (p: Pointer);
  end;

  TTest2 = record
    case int: longint of
      1: (i: integer);
      1: (f: single);
      1: (p: Pointer);
  end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: record mit case

Beitrag von Warf »

Weil die branches nur im ISO bzw extended Pascal modus Bedeutung haben. In den anderen Modi sind sie einfach nur syntaktischer zucker ohne Semantik, daher ists egal ob sie überlapp haben oder auch unvollständig sind.

AFAIK kommt das aus TP und Delphi.

PascalDragon
Beiträge: 997
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: record mit case

Beitrag von PascalDragon »

Mathias hat geschrieben: Fr 24. Okt 2025, 15:39 Wieso wird dieser Code anstandslos kompiliert ?
Weil der Compiler eben nicht fehlerfrei ist... :roll: Irgendwo gibt es glaub ich auch schon einen Bugreport dazu...
FPC Compiler Entwickler

Antworten