absolute in Klassenfeldern nicht erlaubt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1798
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

absolute in Klassenfeldern nicht erlaubt

Beitrag von fliegermichl »

Ich habe eben versucht, eine absolute Definition in einer Klasse zu verwenden. Das akzeptiert der Compiler nicht.
Ist bei Delphi das gleiche.

Hat jemand eine Idee, weshalb?
Einen varianten Record kann man definieren.
Eine Property mit Setter/Getter Methode natürlich auch, die einen Typecast macht.

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

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Mathias »

Zeig doch ein Beispiel, das sieht man eher was du meinst.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1798
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von fliegermichl »

Wenn man das auskommentierte absolute mit reinnimmt, meckert der Compiler.
Die variante Recorddefinition macht exakt das gleiche und auch als Variablendeklaration im Hauptprogramm geht es.
Nur eben in der Klassendefinition nicht.

Code: Alles auswählen

program Project1;

type
  TTest = class
    EinRecord : record
     case Integer of
      1 : (EinByte : Byte);
      2 : (EinInteger : Integer);
    end;
    ZweiByte : Byte;
    ZweiInteger : integer;// absolute ZweiByte;
  end;

var
  EinByte : Byte;
  EinInteger : Integer absolute EinByte;

begin

end.

Benutzeravatar
Zvoni
Beiträge: 711
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Zvoni »

Das einzige was ich diesbezüglich finden konnte, ist die KI-Zusammenfassung von Google (und ja: Ich weiss wegen KI-Antworten, aber es ist wirklich das einzige was ich finden konnte)
Dummerweise (bzw. gar nicht überraschend) finde ich keinen Bezug auf einen Doku-Eintrag oder ähnliches, nicht mal Wiki. Nur eine Referenz auf einen Forum-Thread im intern. Forum, welches aber zur Frage keinen Bezug hat
You cannot use absolute directly on class instances. Instead, use it on local variables to alias class members, map class data to different types, or override memory restrictions.

No Class Fields: You cannot declare a class field (e.g., FMyVar: Integer absolute ...) directly inside a class type block.
Falls jemand eine "echte" Referenz zur Dokumentation findet, lösche ich das hier dann
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von theo »

Ein Grund könnte sein, dass Records auf dem Stack und Klassen(instanzen) auf dem Heap liegen. Letztere sind eigentlich Zeiger.

Es meldet sich sicher bald jemand, der mehr Durchblick hat, warum das mit "absolute" so ist.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1798
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von fliegermichl »

theo hat geschrieben: Mo 20. Jul 2026, 10:58 Ein Grund könnte sein, dass Records auf dem Stack und Klassen(instanzen) auf dem Heap liegen. Letztere sind eigentlich Zeiger.
Das ist aber bei der varianten Recorddefinition auch so. Es geht ja eigentlich nur darum, auf einzelne Bestandteile einer Variablen elegant zugreifen zu können oder einen Typecast zu machen ohne diesen jedesmal explizit angeben zu müssen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7388
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von af0815 »

BTW: Der Code 1:1 kopiert, kompiliert bei mir ?!?!
Compile Project, Target: /home/xxxx/data/lazdev/stable_trunk/projects/project1: Success, Hints: 4
Hint: Start of reading config file /home/xxxx/data/lazdev/stable_trunk/fpc/bin/x86_64-linux/fpc.cfg
Hint: End of reading config file /home/xxxx/data/lazdev/stable_trunk/fpc/bin/x86_64-linux/fpc.cfg
Verbose: Free Pascal Compiler version 3.2.2-r0d122c49 [2026/01/17] for x86_64
Verbose: Copyright (c) 1993-2021 by Florian Klaempfl and others
Verbose: Target OS: Linux for x86-64
Verbose: Compiling /home/xxxx/data/lazdev/stable_trunk/projects/project1.lpr
project1.lpr(4,11) Hint: Local type "TTest" is not used
project1.lpr(16,3) Hint: Local absolutevar "EinInteger" is not used
Verbose: Linking /home/xxxx/data/lazdev/stable_trunk/projects/project1
Verbose: 21 lines compiled, 0.0 sec
Verbose: 4 hint(s) issued
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 711
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Zvoni »

theo hat geschrieben: Mo 20. Jul 2026, 10:58 Ein Grund könnte sein, dass Records auf dem Stack und Klassen(instanzen) auf dem Heap liegen. Letztere sind eigentlich Zeiger.

Es meldet sich sicher bald jemand, der mehr Durchblick hat, warum das mit "absolute" so ist.
Könnte mir eher vorstellen, dass das eher was damit zu tun hat, dass der Compiler die "Reihenfolge" der Felder verändern kann (und somit den Offset der Adresse bzw. das "du kannst nur verwenden was vorher bekannt ist"), falls dadurch eine effizientere Speichernutzung entsteht (Alignment usw.).

Ausserdem bezweifle ich, dass der Variant-Record und "absolute" denselben "Mechanismus" verwenden

Andererseits glaube ich mich daran zu erinnern, dass absolute nur auf eine Variablen-Instanz funktioniert, und eben nicht auf eine Typen-Deklaration.
Eben WEIL eine Variable eine Speicheradresse hat im Gegensatz zu einer reinen Typen-Deklaration.
Und Klassen-Felder sind nunmal Bestandteil einer Typen-Deklaration, und nicht einer Variablen-Instanz
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Mathias »

Ich vermute, in einem type geht dies nicht, nur bei var. Und eine ganze Klasse ist ja ein type.

Code: Alles auswählen

var
  i1:Integer;
  i2:Integer absolute i1; // geht

type
  a=Integer;
  b=Integer absolute a; // geht nicht
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1798
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von fliegermichl »

Mathias hat geschrieben: Mo 20. Jul 2026, 12:50 Ich vermute, in einem type geht dies nicht, nur bei var. Und eine ganze Klasse ist ja ein type.

Code: Alles auswählen

var
  i1:Integer;
  i2:Integer absolute i1; // geht

type
  a=Integer;
  b=Integer absolute a; // geht nicht
Das ist ja klar, weil eine Typdeklaration ja keinerlei Adresse hat. Erst wenn eine Instanz von a deklariert wird, kann man eine Instanz von b via absolute an der gleichen Adresse definieren.

Aber wo wir schonmal dabei sind.

Was ist eigentlich der Unterschied zwischen diesen beiden Deklarationen?

Code: Alles auswählen

type
 a = Integer;
 b = type Integer;

Benutzeravatar
Zvoni
Beiträge: 711
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Zvoni »

Mathias hat geschrieben: Mo 20. Jul 2026, 12:50 Ich vermute, in einem type geht dies nicht, nur bei var. Und eine ganze Klasse ist ja ein type.

Code: Alles auswählen

var
  i1:Integer;
  i2:Integer absolute i1; // geht

type
  a=Integer;
  b=Integer absolute a; // geht nicht
Was aber (anscheinend? Nicht getestet) funktioniert ist das hier:

Code: Alles auswählen

Var
  k: TMeineKlasse;
  f: Integer Absolute k.MeinIntegerFeld;
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Socke
Lazarusforum e. V.
Beiträge: 3190
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: absolute in Klassenfeldern nicht erlaubt

Beitrag von Socke »

fliegermichl hat geschrieben: Mo 20. Jul 2026, 13:42 Was ist eigentlich der Unterschied zwischen diesen beiden Deklarationen?

Code: Alles auswählen

type
 a = Integer;
 b = type Integer;
a ist ein Alias für Integer. b erzeugt einen eigenen Typen - das wäre insb. für RTTI wichtig. Ansonsten sind a und b weiterhin zuweisungskompatibel.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von theo »

Socke hat geschrieben: Mo 20. Jul 2026, 13:53 a ist ein Alias für Integer. b erzeugt einen eigenen Typen - das wäre insb. für RTTI wichtig. Ansonsten sind a und b weiterhin zuweisungskompatibel.
Es gibt online ein Beispiel für Delphi, welches anscheinend für "Check(b)" nicht funktioniert mit Meldung:
compiler error: E2033 Types of actual and formal var parameters must be identical
FPC 3.2.2 meckert da aber nicht. Gibt es dafür eine Einstellung? "{$mode delphi}" ändert nichts daran.

Code: Alles auswählen

type
  Ta = string;       // type alias
  Tb = type string;  // compatible but distinct new type

procedure Check(var s: string);
begin
  ShowMessage(s);
end;

procedure TMain.Button2Click(Sender: TObject);
var
  a: Ta;
  b: Tb;
begin
  a := 'string of type Ta,';
  b := 'string of type Tb.';
  Check(a);
  Check(b);
end;

Antworten