absolute in Klassenfeldern nicht erlaubt
- 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
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.
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
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
Mit Java und C/C++ sehe ich rot
- 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
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.
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.
- 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
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
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
Falls jemand eine "echte" Referenz zur Dokumentation findet, lösche ich das hier dannYou 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.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Re: absolute in Klassenfeldern nicht erlaubt
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.
Es meldet sich sicher bald jemand, der mehr Durchblick hat, warum das mit "absolute" so ist.
- 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
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.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.
- 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
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).
- 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
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.).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.
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.
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
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
Mit Java und C/C++ sehe ich rot
- 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
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.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
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;
- 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
Was aber (anscheinend? Nicht getestet) funktioniert ist das hier: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
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.
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
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.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;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: absolute in Klassenfeldern nicht erlaubt
Es gibt online ein Beispiel für Delphi, welches anscheinend für "Check(b)" nicht funktioniert mit Meldung: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.
FPC 3.2.2 meckert da aber nicht. Gibt es dafür eine Einstellung? "{$mode delphi}" ändert nichts daran.compiler error: E2033 Types of actual and formal var parameters must be identical
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;