absolute in Klassenfeldern nicht erlaubt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Socke
Lazarusforum e. V.
Beiträge: 3192
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 »

Warf hat geschrieben: Mo 20. Jul 2026, 20:06 Gegenfrage, warum sollte das funktionieren? Variante records haben eine gänzlich andere Semantik. Z.B. wenn bei einem Varianten record ein branch größer ist als der andere ist das kein problem da beide branches gleichwertig sind. Absolute ist eine art alias, hierbei sind die branches nicht gleichwertig sondern der absolut Bezeichner ist ein alias für die Speicheradresse und wenn die typgrößen nicht matchen dann knallt es
Der Compiler sorgt nur dafür, dass die varianten Records mindestens genug Speicher für die größte Variante haben. Semantisch kann man damit entweder den Zugriff auf die selben Daten (z.B. Integer vs. array of Byte) oder auch semantisch nicht verwandte Daten halten.
Beim Schlüsselwort absolute bist du selbst verantwortlich auf die Speichergrößen zu achten - der Compiler hilft dir dabei nicht. Auch greift absolute immer auf den Anfang der Zielvariablen zu, während man bei varianten Records über Platzhalterfelder recht frei auf alle Bytes zugreifen kann, solange man das Speicherlayout korrekt beachtet ...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 7340
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 »

Dies ist so eine typische Anwendung von absolute.

Code: Alles auswählen

program project1;

// Dies ist in einer fremden Unit, zB. C-Bindung

type
  TCall=procedure(data:Pointer);

  procedure CFunc(cp:TCall; data:Pointer);
  begin
    cp(data);
  end;


// Die ist die Anwendung der Unit

type
  TMyRec=record
    a,b:Integer;
  end;
  PMyRec=^TMyRec;

var
  myRec:TMyRec;

procedure cb(data: Pointer);
var
  myRec:PMyRec absolute data;
begin
  WriteLn(myRec^.a,' - -',myRec^.b);
end;

begin
  myRec.a:=123;
  myRec.b:=456;
  CFunc(@cb, @myRec);
end. 
Oder bei Verwendung vom Mikrocontrollern. Da wird direkt auf eine Speicher Adresse veerlinkt.

Code: Alles auswählen

  USIDR : byte absolute $00+$BA; // USI Data Register
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Warf »

Socke hat geschrieben: Mo 20. Jul 2026, 21:44 Der Compiler sorgt nur dafür, dass die varianten Records mindestens genug Speicher für die größte Variante haben. Semantisch kann man damit entweder den Zugriff auf die selben Daten (z.B. Integer vs. array of Byte) oder auch semantisch nicht verwandte Daten halten.
Beim Schlüsselwort absolute bist du selbst verantwortlich auf die Speichergrößen zu achten - der Compiler hilft dir dabei nicht. Auch greift absolute immer auf den Anfang der Zielvariablen zu, während man bei varianten Records über Platzhalterfelder recht frei auf alle Bytes zugreifen kann, solange man das Speicherlayout korrekt beachtet ...
Tatsächlich sind Variante records nie dafür gedacht gewesen auf den selben Speicherbereich zuzugreifen. Der ISO Pascal Standard ist da ganz klar:
An access to a component of a variant of a variant-part, where the selector of the variant-part is not a field, shall attribute to the selector that value associated (see 6 .4 .3 .3) with the variant . It shall
be an error unless a variant is active for the entirety of each reference and access to each component of the variant.

When a variant becomes non-active, all of its components shall become totally-undefined.
NOTE | If the selector of a variant-part is undefined, then no variant of the variant-part is active.
Daran hat sich nur keiner gehalten und da TP und später Delphi den quasi standard setzen bei denen das erlaubt ist, ist das weit verbreitet.
Ist übrigens in C nicht anders. Nutzung von Unions um Speicherbereiche zu Mappen ist auch UB.

Aber wie du gesagt hast, bei Varianten records sorgt der compiler wenigstens dafür das du nichts falsch machen kannst, indem der Speicherbereich automatisch gelayoutet wird und managed typen verboten sind. Absolute macht das nicht. Absolute nimmt die wunderbare Typsicherheit von Pascal und denkt sich: das braucht doch keiner. MMn. Sollte man absolut nicht verwenden, da es quasi alle garantien des Typsystems über board wirft

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

Re: absolute in Klassenfeldern nicht erlaubt

Beitrag von Warf »

Mathias hat geschrieben: Di 21. Jul 2026, 09:12 Oder bei Verwendung vom Mikrocontrollern. Da wird direkt auf eine Speicher Adresse veerlinkt.

Code: Alles auswählen

  USIDR : byte absolute $00+$BA; // USI Data Register
Was spricht gegen

Code: Alles auswählen

const  USIDR = PByte($00+$BA); // USI Data Register
Wenn das argument für absolute ist das man sich spart ein ^ zu tippen, ist das ein seeeehr schwaches argument. Insbesondere da man mit autoderef sich das sowieso in vielen Fällen sparen kann wenn man wirklich so faul ist

Mathias
Beiträge: 7340
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 »

Insbesondere da man mit autoderef sich das sowieso in vielen Fällen sparen kann wenn man wirklich so faul ist
Das kannte ich nicht, dieser Schalter scheint zu funktionieren. Ich habe mein Beispiel von vorhin geändert.

Code: Alles auswählen

{$modeswitch autoderef}
....
procedure cb(data: Pointer);
var
  myRec:PMyRec absolute data;
begin
  WriteLn(myRec.a,' - -',myRec.b);
end;
Bei den Pascal Classen, sieht man auch nirgends ein ^, somit muss dies das standardmässig aktiv sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3192
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 »

Mathias hat geschrieben: Di 21. Jul 2026, 11:49 Bei den Pascal Classen, sieht man auch nirgends ein ^, somit muss dies das standardmässig aktiv sein.
Bei dem class-Keyword sorgt der Compiler für die Dereferenzierung. Das ist syntaktisch so festgelegt.
Wenn du selbst mit Pointern auf Instanzen schießen willst, musst du entweder object oder C++ nehmen :lol:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten