Datentyp extended

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Datentyp extended

Beitrag von Warf »

Mathias hat geschrieben:
Do 12. Okt 2023, 17:17
Da habe ich jetzt nicht schlecht gestaunt, dies wird tatsächlich kompiliert.
Vor allem links vom := sieht echt merkwürdig aus.

Code: Alles auswählen

function ntohll(ll:QWord):QWord;
begin
  Result:=0;
  PByte(@Result)[0]:=PByte(@ll)[7];
  PByte(@Result)[1]:=PByte(@ll)[6];
  PByte(@Result)[2]:=PByte(@ll)[5];
  PByte(@Result)[3]:=PByte(@ll)[4];
  PByte(@Result)[4]:=PByte(@ll)[3];
  PByte(@Result)[5]:=PByte(@ll)[2];
  PByte(@Result)[6]:=PByte(@ll)[1];
  PByte(@Result)[7]:=PByte(@ll)[0];
end;
Ich hätte sowas mit mit and, or, not, shl, etc. gelöst.
Das sowas geht hätte ich nie gedacht.
Im Mode ObjFPC können Pointer als Arrays benutzt werden (im Mode Delphi nur ein paar Pointer, aber PByte gehört dazu). Das PByte(@Result)[INDEX] sagt dem Compiler also einfach "tu so als wäre Result ein Byte array und greif auf das Element INDEX zu". Und das geht auf beiden Seiten eines Assignments. Hier wird also Result als Byte Array interpretiert um die Bytes einzeln zu schreiben, und ll wird als Byte array interpretiert um die einzelnen Bytes zu lesen.

Das geht übrigens im Mode ObjFPC mit allen Pointer typen:

Code: Alles auswählen

type
  PWordRec = ^TWordRec;
  TWordRec = record
    loByte, hiByte: Byte;
  end;

var
  i: Integer = 2135204;
begin
  WriteLn(PWordRec(@i)[0].loByte);
  WriteLn(PWordRec(@i)[0].hiByte);
  WriteLn(PWordRec(@i)[1].loByte);
  WriteLn(PWordRec(@i)[1].hiByte);
end.
Ist für so low-level kram relativ nützlich. Im Mode Delphi wo das leider nicht für alle Pointer geht, wird normalerweise dann ein anderer weg genutzt, über statische Array pointer:

Code: Alles auswählen

type
  TWordRec = record
    loByte, hiByte: Byte;
  end;
  TWordRecArray = array[0..High(SizeInt) div sizeOf(TWordRec) - 1] of TWordRec;
  PWordRecArray = ^TWordRecArray;

var
  i: Integer = 2135204;
begin
  WriteLn(PWordRecArray(@i)^[0].loByte);
  WriteLn(PWordRecArray(@i)^[0].hiByte);
  WriteLn(PWordRecArray(@i)^[1].loByte);
  WriteLn(PWordRecArray(@i)^[1].hiByte);
end.
Da das allerdings viel umständlicher ist, bin ich kein Fan davon

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Datentyp extended

Beitrag von Lincoln Six Echo »

Vielen Dank an Warf. Das funktioniert perfekt.

Statt ntohs() geht auch swapendian() dann braucht man die winsock nicht.

Wie kann man das denn umkehren, also von 44100.000 nach array[0..9] ?

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

Re: Datentyp extended

Beitrag von Mathias »

Viele wege führen nach Rom, hier auch noch eine Lösung, wen einem das mit den Pointern zu kompliziert ist.

Code: Alles auswählen

  function ntohll(ll: QWord): QWord;
  var
    q: array[0..7] of byte absolute ll;
    r: array[0..7] of byte absolute Result;
  begin
    r[0] := q[7];
    r[1] := q[6];
    r[2] := q[5];
    r[3] := q[4];
    r[4] := q[3];
    r[5] := q[2];
    r[6] := q[1];
    r[7] := q[0];
  end; [/code
]
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
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: Datentyp extended

Beitrag von PascalDragon »

Man könnte ja auch einfach BEtoN oder LEtoN nutzen 🤷‍♀️
FPC Compiler Entwickler

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Datentyp extended

Beitrag von Socke »

Ich habe in der M68000 Dokumentation von NXP https://www.nxp.com/docs/en/reference-m ... 8000PM.pdf in Abschnitt 1.5.2 Binary Floating-Point Formats die Definition eines 10-Bytes Floating Types gefunden. Hilft euch das?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Datentyp extended

Beitrag von Lincoln Six Echo »

Vielen Dank !

Dokumentationen helfen immer ;-)

Ich hatte bisher keine einzige Datei mehr bei der die Umrechnung nicht perfekt funktioniert hat.

Nur für das umgekehrte Verfahren also vom Wert als double oder single nach 80 Bit IEEE usw. habe ich noch keine Lösung.

Antworten