Variablen überlagern

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
theo
Beiträge: 9312
Registriert: Mo 11. Sep 2006, 19:01

Re: Variablen überlagern

Beitrag von theo »

fliegermichl hat geschrieben:
Fr 19. Aug 2022, 13:57
Aus Gründen der Faulheit. Meistens muss man mehr als nur eine Operation auf der Variablen ausfuehren.
Naja.. :lol:
PascalDragon hat geschrieben:
Fr 19. Aug 2022, 14:16
Der as-Operator ist vergleichsweise teuer (genauso wie der is-Operator) und den Hauptteil davon hast du ja schon mit is gemacht, warum also nochmal? Also entweder 'nen harten Cast oder absolute.
Ich würde auch einen harten Cast machen nach dem "is".
Das war für mich jetzt nicht der Punkt meiner Frage.
Ich wollte nur herausfinden, warum fliegermichl das mit "absolute" löst und nicht mit "is" oder casting.
"Absolute" hat für mich etwas "hackiges" und wäre in diesem Fall nicht meine erste Wahl.

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

Re: Variablen überlagern

Beitrag von Warf »

siro hat geschrieben:
Fr 19. Aug 2022, 13:38
Absolute ist eigentlich unumgänglich für Embedded Anwendungen.
So werden die Register des Controllers definiert, die ja immer an einer festen Adresse liegen.
Beispielsweise so:
Unumgänglich würde ich nicht sagen, pointer gehen einfach:

Code: Alles auswählen

const SYSTICK_BASE_ADDRESS = $E000E010;   // Basisadresse beim STM32Fxxx

var STK_CTRL  : PDWORD = PDWord(SYSTICK_BASE_ADDRESS + 0);    // Steuerung interupt Clock select usw.
var STK_LOAD  : PDWORD = PDWord(SYSTICK_BASE_ADDRESS + 4;    // Zaehlerwert welcher beim Erreichen von 0 wieder geladen werden soll
var STK_VAL   : PDWORD = PDWord(SYSTICK_BASE_ADDRESS + 8);    // aktuelle Zählerstand des 24 Bit Zählers

begin
  STK_CTRL^ := 7;    // counter enable, enable interrupt
  .....
Zugegeben das ist einer der Fälle indenen man argumentieren kann das der syntaktische zucker von absolut ganz nett ist, aber im endeffekt nimmt es nur den "aufwand" einmal ^ tippen zu müssen. Aber ist ^ tippen wirklich so viel aufwand das das einen ganz eigenes syntaktisches Konstrukt?

Man könnte argumentieren das man damit ja ausversehen den pointer modifizieren könnte, aber das kann man mit const fixen:

Code: Alles auswählen

const SYSTICK_BASE_ADDRESS = $E000E010;
const STK_CTRL = PDWord(SYSTICK_BASE_ADDRESS + 0);
begin
  STK_CTRL^ := 42;
  STK_CTRL := 32; // Error: Can't assign values to an address
end.   
Die const variante ist sogar 7 chars kürzer als die absolute variante, also man kann 7 mal ^ benutzen bevor man den selben tippaufwand hat

Also auch hier muss ich sagen: Absolut kein grund absolut zu verwenden.

Bei einem Spezialfall sollte man sich immer Fragen ob der wirklich speziell genug ist eine eigene syntax mit eigenen implikationen (wie hier das aushebeln aller compilerchecks bei verwendung für andere zwecke wie z.b. typecasting) zu bekommen, und für absolut seh ich das beim besten willen nicht

Benutzeravatar
kupferstecher
Beiträge: 377
Registriert: Do 17. Nov 2016, 11:52

Re: Variablen überlagern

Beitrag von kupferstecher »

Warf hat geschrieben:
Fr 19. Aug 2022, 14:24
Zugegeben das ist einer der Fälle indenen man argumentieren kann das der syntaktische zucker von absolut ganz nett ist, aber im endeffekt nimmt es nur den "aufwand" einmal ^ tippen zu müssen. Aber ist ^ tippen wirklich so viel aufwand das das einen ganz eigenes syntaktisches Konstrukt?
Man muss nicht nur das eine Zeichen ^ tippen, sondern auch wissen, wo es hinkommt und wann man es benötigt. Ich sehe es schon als enormen Vorteil, wenn man die ganze Pointerei umgehen kann.
Die const variante ist sogar 7 chars kürzer als die absolute variante, also man kann 7 mal ^ benutzen bevor man den selben tippaufwand hat

Also auch hier muss ich sagen: Absolut kein grund absolut zu verwenden.
Bei Mikrocontrollern werden alle Register einmal in einer Datei definiert, in der Regel automatisch übersetzt von c-Headern der Mikrocontrollerhersteller. Der normale Pascalprogrammierer fasst die Datei nie an, sondern benutzt nur die Register, da ist "absolute" absolut wertvoll :D

Hier noch ein Beispiel aus einer "Header"-Datei:

Code: Alles auswählen

Type
    { General Purpose I/O  }
    TGPIO_TypeDef = record
        CFGLR : uInt32;
        CFGHR : uInt32;
        INDR : uInt32;
        OUTDR : uInt32;
        BSHR : uInt32;
        BCR : uInt32;
        LCKR : uInt32;
      end;

var
  PortA: TGPIO_TypeDef  absolute GPIOA_BASE;
  PortB: TGPIO_TypeDef  absolute GPIOB_BASE;
  PortC: TGPIO_TypeDef  absolute GPIOC_BASE;
  PortD: TGPIO_TypeDef  absolute GPIOD_BASE;
  PortE: TGPIO_TypeDef  absolute GPIOE_BASE;
  PortF: TGPIO_TypeDef  absolute GPIOF_BASE;
  PortG: TGPIO_TypeDef  absolute GPIOG_BASE;
Einfach in der Benutzung:

Code: Alles auswählen

PortB.CFGLR:= $FF;
Und man kann auch unkompliziert mit den Typen arbeiten:

Code: Alles auswählen

Procedure LEDInit(var aPort: TGPIO_TypeDef; aPin: Word);
begin
  aPort.CFGLR:= ...
  aPort.CFGHR:= ...
end;

Code: Alles auswählen

LEDInit(PortB,3);

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

Re: Variablen überlagern

Beitrag von Mathias »

Absolute ist eigentlich unumgänglich für Embedded Anwendungen.
So werden die Register des Controllers definiert, die ja immer an einer festen Adresse liegen.
Dies funktioniert auch auf PCs, solange sie im Real-Modus laufen. Aber dies ist heute kaum der Fall. Einzig bei der Treiber Entwicklung könnte ich mir die vorstellen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten