Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Diese C-Struktur in Delphi? (https://www.delphipraxis.net/47977-diese-c-struktur-delphi.html)

Pseudemys Nelsoni 18. Jun 2005 20:39


Diese C-Struktur in Delphi?
 
Moin,

wie krieg ich den C-Code hier:

Code:
typedef struct st_used_mem {         
  struct st_used_mem *next;         
  unsigned int   left;            
  unsigned int   size;            
} USED_MEM;
in Delphi umgewandelt?

Ich habe es so versucht:

Delphi-Quellcode:
type
  pst_used_mem = ^st_used_mem;
  st_used_mem = record
    next: pst_used_mem;
    left: Cardinal;
    size: Cardinal;
  end;

var
  USED_MEM: pst_used_mem;

ist das richtig so?

ltiefland 18. Jun 2005 20:50

Re: Diese C-Struktur in Delphi?
 
Frage: Warum verwendest Du nicht Integer? Außerdem die Zeile
Delphi-Quellcode:
pst_used_mem = ^st_used_mem;
muß glaube ich weiter nach hinten (vor die var Zeile)

Pseudemys Nelsoni 18. Jun 2005 20:52

Re: Diese C-Struktur in Delphi?
 
Moin Itiefland,

Zu ersterem: Weil ein unsigned int einem Cardinal entspricht.
Zu zweiterem: Ne, ist ja keine Variable, sondern ein Typ.

MfG ;)

Christian Seehase 18. Jun 2005 21:17

Re: Diese C-Struktur in Delphi?
 
Moin Pseudemys Nelsoni,

also wenn mich meine C(++) Kenntnisse nicht ganz trügen müsste es so aussehen:

Delphi-Quellcode:
type
  PUSED_MEM = ^USED_MEM;
  USED_MEM = packed record
    next: PUSED_MEM;
    left: Cardinal;
    size: Cardinal;
  end;
wobei Deine Variante mit dem st_used_mem und pst_used_mem auch richtig wären, aber unüblich sind, da der Tagname (hier st_used_mem) bei einer Typdeklaration optional ist.
Hiesse es nur struct ...., ohne typedef, wäre USED_MEM eine Variable des Typs der Struktur, da aber das typedef davor steht, ist es ein Alias für den Typ der mit struct deklariert wird. Obwohl es typedef heisst, kann man hiermit keine neuen Typen deklarieren, sondern nur Namen für bestehende vergeben.

Pseudemys Nelsoni 18. Jun 2005 21:42

Re: Diese C-Struktur in Delphi?
 
Moin Christian,

danke für deine Antwort. Habe noch einige Fragen ;)

1. Wieso ist dein Rekord gepackt?

2.
Zitat:

da der Tagname (hier st_used_mem) bei einer Typdeklaration optional ist
Die Variable USED_MEM ist aber auch oprtional, oder?

3.
Zitat:

es typedef heisst, kann man hiermit keine neuen Typen deklarieren, sondern nur Namen für bestehende vergeben
Hm, aber es wird doch ein neuer Typ dort deklariert oder? Es muss ja ein Typ sein, sonst würde man ihn in Delphi ja nicht auch als Typ deklarieren :)

Christian Seehase 18. Jun 2005 23:31

Re: Diese C-Struktur in Delphi?
 
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:

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.

... :gruebel: ....

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz