Moin Pseudemys Nelsoni,
ich habe packed verwendet, damit der Record auf keinen Fall Lücken im Speicher hat.
Unter Umständen könnten durch Alignment Lücken entstehen, wenn der Compiler Füllbytes in den Record "einstreut", damit auch alle Felder auf einer bestimmten Grenze liegen.
Das ist aber nicht immer sinnvoll, z.B., wenn man den Record an eine Funktion übergibt, die nichts von den Lücken weiss, und dann, eventuell, Daten in die Füllbytes schreibt.
Zitat von
Pseudemys Nelsoni:
Die Variable USED_MEM ist aber auch oprtional, oder?
Bei einem Typedef ist das keine Variable, sondern ein Alias für den Typ und darf nicht weggelassen werden. Mindestens ein Alias muss da stehen, mehrere, auch ergänzt um Pointerangaben sind möglich. Nur ohne typedef wäre es eine Variable vom Typ der Struktur.
Es wird dort, zumindest gemäss C-Konventionen, kein Typ deklariert. Das man daraus in Delphi eine Typdeklaration macht ist dann wieder eine andere Sache.
Wenn ich das richtig interpretiere wird, in diesem konkreten Beispiel, der Typ st_used_mem deklariert, was allerdings nicht am typedef, sondern am struct liegt, sowie ein Alias für diesen Typ.
...
....
Also wenn ich mal genau darüber nachdenke, müsste man es in Delphi sogar so deklarieren:
Delphi-Quellcode:
// wegen struct mit Tagname
type
Pst_used_mem = ^st_used_mem;
st_used_mem = packed record
next: Pst_used_mem;
left: Cardinal;
size: Cardinal;
end;
// wegen typedef
USED_MEM = st_used_mem;
Denn durch struct st_used_mem ist der Typ st_used_mem ja auch deklariert worden.