Pascal intelligente Sprache, dank bitpacked und absolute

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Pascal intelligente Sprache, dank bitpacked und absolute

Beitrag von Warf »

Mathias hat geschrieben:Habe ich das richtig gesehen, in C++ gibt es auch eine Art with ?

Nein, das ist die Structure Inizialisierung:

Code: Alles auswählen

struct {int a, b,c} a = {.a=5, .b=10, .c=0};
struct {int a,b,c} b = {5, 10, 0}; // würde ich nicht empfehlen, kann bei größeren structs schnell in die hose gehen


Du kannst dir aber Theoretisch sowas ähnliches bauen (siehe hier):

Code: Alles auswählen

#define WITH(T) do { struct WITH : T { void operator()() {
#define ENDWITH(X) }}; static_cast<WITH&>((X))(); } while(0)
 
struct Bar {
    int field;
};
 
void foo( Bar &b ) {
        WITH( Bar )
            cerr << field << endl;
        ENDWITH( b );
}

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

Re: Pascal intelligente Sprache, dank bitpacked und absolute

Beitrag von Mathias »

Bitpacked wird recht steng behandelt, in folgendem Beispiel wird sogar das Byte zerschnitten.
Ansonsten wäre TestRecord grösser als 2 Bytes.

Code: Alles auswählen

type
  TestRecord = bitpacked record
    a: 0..3;
    b: byte;
    c: 0..3;
  end;
begin
  WriteLn(SizeOf(TestRecord)); // --> 2


Alles in allem, mit bitpacked, egal ob mit Record und Array, wird das initialisieren von Registern auf einem AVR um einiges erleichtert.

Vor allem dies finde ich sehr elegant:

Code: Alles auswählen

type 
  tSadc = bitpacked record  // Statusflags ADC
    AdcValue : 0..2047;   // Bit 0..11
    ShutDown : FALSE..TRUE;    // Bit 12
    Gain     : 0..1;    // Bit 13
    VRef     : 0..1;    // Bit 14
    Dac      : 0..1;    // Bit 15
  end;
 
procedure Send(value:Uint16);
begin
  tSadc(value).ShutDown := TRUE;
  tSadc(value).Vref := VREF_unbuffered;


Im Wiki habe ich gerade noch ein Beitrag gefunden, welchen der Unterschied zu C++ zeigt.
http://wiki.freepascal.org/Creating_bin ... sing_stuff
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten