Pascal intelligente Sprache, dank bitpacked und absolute

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: Pascal intelligente Sprache, dank bitpacked und absolute

Beitragvon Warf » 13. Aug 2018, 19:19 Re: Pascal intelligente Sprache, dank bitpacked und absolute

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 );
}
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 14. Aug 2018, 16:13 Re: Pascal intelligente Sprache, dank bitpacked und absolute

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •
Vorherige

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

cron
porpoises-institution
accuracy-worried