Ord vs. Byte

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

Ord vs. Byte

Beitrag von Mathias »

Gibt es da einen Unterschied ?
Oder ist Ord() nur ein Relikt aus der TP Zeit ?

Code: Alles auswählen

  WriteLn(Ord('x'));   // -> 120
  WriteLn(byte('x'));  // -> 120
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Ord vs. Byte

Beitrag von theo »


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

Re: Ord vs. Byte

Beitrag von Mathias »

Wie ich es vermutet habe.
Ich verwende fast ausschliesslich Byte, und für den Rückweg Char().
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Ord vs. Byte

Beitrag von Warf »

Ord funktioniert halt auf beliebigen Ordinaltypen beliebiger Größe. Beispiel:

Code: Alles auswählen

type
  TTest = (A=1337);

begin
  WriteLn(Byte(A)); // 57
  WriteLn(Ord(A)); // 1337
end.
Wenn du einen Typcast machst hast du halt immer die implizite Annahme über die Größe des typen. Wenn du weist das dein Source typ nur 1 Byte groß ist, wie AnsiChar, dann ist Byte ungefährlich. Wenn du allerdings nicht sicher bist, z.b. bei einem Enum das du nicht selbst definierst, nimm besser Ord

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

Re: Ord vs. Byte

Beitrag von Mathias »

Wenn du einen Typcast machst hast du halt immer die implizite Annahme über die Größe des typen.

Code: Alles auswählen

var
  p:Pointer;
begin
  WriteLn(Ord(1234));    // io.
  WriteLn(Ord('ö'));     // error.
  WriteLn(Ord(p));       // error.
Dies geht leider nicht. Somit sehe ich eigentlich keinen Sinn dahinter. Einen Integer in einen Integer umwandeln braucht man eigentlich gar nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Ord vs. Byte

Beitrag von Warf »

Naja es gibt noch mehr ordinaltypen. Enums oder die diversen bolean Typen (z.b. longbool).

Ord nimmt einen ordinaltypen beliebiger Größe und gibt dir das Ergebnis als integer Typ in der entsprechenden Größe zurück. Also bei einem 2 byte enum gibt dir ord ein word zurück.

Das ist z.b. wichtig wenn du mit generics arbeitest und im Vorhinein nicht weißt wie groß der Typ ist den du in der Hand hälst

wp_xyz
Beiträge: 5193
Registriert: Fr 8. Apr 2011, 09:01

Re: Ord vs. Byte

Beitrag von wp_xyz »

Mathias hat geschrieben: So 13. Okt 2024, 08:31

Code: Alles auswählen

  WriteLn(Ord('ö'));     // error.
'ö' ist in der von Lazarus verwendeten UTF8-Kodierung kein Char, sondern ein String bestehend aus zwei Chars (#$C3#$B6), also kein Ordinal-Typ.

Antworten