Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: C struct nach Delphi record

  Alt 14. Dez 2005, 14:07
Zitat von Reiner12:
Nur mit typedef union hab ich noch Verständnisprobleme.
Die Varianten Teile in Records habe ich zwar kappiert, aber irgendwie läßt sich das für mich nicht auf dieses Konstrukt anwenden:
Code:
typedef union {
           WORD W;
           struct { BYTE xorsum;
                    BYTE nullen;
                  };
 } TChkSum;
Ist mir völlig unlogisch.
Die Idee ist eigentlich ganz einfach, du legst für "struct { Byte xorsum, Byte nullen}" einen neuen Type an, dann erstellst du ein
Delphi-Quellcode:
TChkSum = record
  case Integer of
   0 : (w : Word);
   1 : (n : NeuerTyp);
end;
Hier kannst du dann mit TChkSum entweder TChkSum.w benutzen oder halt TChkSum.n.xorsum und TChkSum.n.nullen, dabei wird ein solches variantes Record immer nur den maximalen Platzbedarf reservieren. Deutlicher wäre es, wenn z.B. n 32 Bit hätte, dann wäre w < 32 Bit (16 Bit), aber dein Record immer genau 32 Bit groß.

Die benutzten Konstanten sind eigentlich völlig egal.

Zitat von Reiner12:
Ist es im C-Source eigendlich normal das #define in mitten den Structuren stehen?

Und was bedeuten das?
Code:
#define GetGoodBad(f)     ((f & SNDF_GOOD_BAD_MASK) >&gt; 5)
#define GetSRGoodBad(sr)  (GetGoodBad((sr)-&gt;Flags))
#define SetSRGoodBad(sr,goodbad)               { \
          (sr)-&gt;Flags &amp;= ~SNDF_GOOD_BAD;         \
          (sr)-&gt;Flags |= ((goodbad&amp;3) <&lt; 5);   }
#define &lt;&gt; Konstante ??
Willkommen in der Welt von C / Präprozessoren. Mit #define legst du eigentlich nur makros fest. Der präprozessor düst dann durch den Code und ersetzt einfach nur die mittels #define deklarierten Blöcke. Ab Delphi 2005 müsste es inline geben, was dann gleichwertig ist.
Also für GetGoodBad(f) ist es einfach nur ein Makro. Du kannst genauso gut eine Methode verwenden, aber die hätte dann immer den Overhead des Aufrufs (ablegen auf dem Stack, ...). Ist eigentlich eher bei sehr hardwarenaher Programmierung (insbesondere wenn die Ressourcen knapp sind) von Bedeutung, auf heutigen Rechnern ist der Overhead einer Prozedur/Funktion doch stark zu vernachlässigen (imho).

Gruß Der Unwissende
  Mit Zitat antworten Zitat