AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Diese C-Struktur in Delphi?

Ein Thema von Pseudemys Nelsoni · begonnen am 18. Jun 2005 · letzter Beitrag vom 18. Jun 2005
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Diese C-Struktur in Delphi?

  Alt 18. Jun 2005, 20:39
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?
Mario
  Mit Zitat antworten Zitat
Benutzerbild von ltiefland
ltiefland

Registriert seit: 2. Mai 2005
Ort: Marl
63 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Diese C-Struktur in Delphi?

  Alt 18. Jun 2005, 20:50
Frage: Warum verwendest Du nicht Integer? Außerdem die Zeile pst_used_mem = ^st_used_mem; muß glaube ich weiter nach hinten (vor die var Zeile)
Lars Tiefland
Live Long And Prosper,
Lars Tiefland
admin at GBS, a Mod for STEF2, New mod versions and support!
Download Opera 8
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

Re: Diese C-Struktur in Delphi?

  Alt 18. Jun 2005, 20:52
Moin Itiefland,

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

MfG
Mario
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Diese C-Struktur in Delphi?

  Alt 18. Jun 2005, 21:17
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Diese C-Struktur in Delphi?

  Alt 18. Jun 2005, 21:42
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
Mario
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Diese C-Struktur in Delphi?

  Alt 18. Jun 2005, 23:31
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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