Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bitte eine Zeile C nach Delphi übersetzen (https://www.delphipraxis.net/29166-bitte-eine-zeile-c-nach-delphi-uebersetzen.html)

SleepyMaster 4. Sep 2004 23:21


Bitte eine Zeile C nach Delphi übersetzen
 
Hi ihrs

Kann mir jemand helfen???

Code:
typedef struct _abc { 
  DWORD def;
  DWORD hij[ANY_SIZE]; //Hier hab ich keine Ahnung
} abc, *Pabc;
Vielen Dank

Snoop007 4. Sep 2004 23:25

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Delphi-Quellcode:
type
  _abc = record
  def : Longword;
  hij : array [0..ANY_SIZE] of Longword;
  end;

SleepyMaster 4. Sep 2004 23:29

Re: Bitte eine Zeile C nach Delphi übersetzen
 
OK! Danke.

Das hij ist also ein array. Aber: Das ANY_SIZE ist ja nach deiner Lösung eine Konstante (Das ANY_SIZE stammt aus dem Original und wurde nicht von mir eingefügt).

Könnte es vielleicht sein, das es so auszusehen hat?

Delphi-Quellcode:
type
  _abc = record
  def : Longword;
  hij : array of Longword;
  end;
also als dynamisches array?

Snoop007 4. Sep 2004 23:33

Re: Bitte eine Zeile C nach Delphi übersetzen
 
ne kann nicht sein,
das ANY_SIZE gibt die grösse an
sont hätte da
Code:
typedef struct _abc { 
  DWORD def;
  DWORD hij[];

oder
typedef struct _abc { 
  DWORD def;
  DWORD *hij;
}
gestanden

SleepyMaster 4. Sep 2004 23:39

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Hab grad in der Headerdatei noch was dazu gefunden:

Code:
#ifndef ANY_SIZE

#define ANY_SIZE 1

#endif
Heißt das ANY_SIZE ist = 1 falls es nicht schon vorher definiert wurde???

Snoop007 4. Sep 2004 23:41

Re: Bitte eine Zeile C nach Delphi übersetzen
 
japp

SleepyMaster 4. Sep 2004 23:46

Re: Bitte eine Zeile C nach Delphi übersetzen
 
OK! Es geht. Vielen Dank Snoop

Snoop007 4. Sep 2004 23:49

Re: Bitte eine Zeile C nach Delphi übersetzen
 
kein problem :)

fiasko 5. Sep 2004 00:27

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Zitat:

Zitat von Snoop007
Delphi-Quellcode:
hij : array [0..ANY_SIZE] of Longword;

Das muß ANY_SIZE-1 heißen - um mal ganz korrekt zu sein 8)

Robert Marquardt 5. Sep 2004 06:31

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Das ist eine typische C Konstruktion.
Es wird ein Record variabler Laenge beschrieben.
Die Deklaration ist nicht fuer eine Variable, sondern dient dazu einen alloziierten Speicherbereich
umzutypen, damit man auf das Array zugreifen kann.

SleepyMaster 5. Sep 2004 10:30

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Zitat:

Das ist eine typische C Konstruktion.
Es wird ein Record variabler Laenge beschrieben.
Die Deklaration ist nicht fuer eine Variable, sondern dient dazu einen alloziierten Speicherbereich
umzutypen, damit man auf das Array zugreifen kann.
Was heißt das jetzt für mich??? Ist das doch ein dynamisches array?

fiasko 5. Sep 2004 10:38

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Zitat:

Zitat von SleepyMaster
Was heißt das jetzt für mich??? Ist das doch ein dynamisches array?

Nein ist es IMHO nicht. Es ist eine Größe festgelegt - also landet das alles auf'm Heap mit fester Länge.

Robert Marquardt 5. Sep 2004 14:43

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Es ist ein dynamisches Array nach Microsoft C Art.
Es wird ein Speicherbereich alloziiert und dann der Anfang des Bereiches mit diesem Recordtyp interpretiert.
Es wird nun der Laengenwert gesetzt. Danach wird oft eine API-Funktion gerufen, die den Bereich ausfuellt.
Manchmal liefert auch eine API-Funktion einen fertig ausgefuellten Bereich ab.

Nur der Name ANY_SIZE deutet an das es so eine Konstruktion ist.
C erlaubt es das eine Arraydeklaration am Ende eines Records/Structs Null Elemente haben darf, also
ein sizeof() von Null. Damit bekommt der Speicherbereich hinter dem Record einen Namen und Typ.

SleepyMaster 5. Sep 2004 16:10

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Und wie kann ich das am vernünftigsten nach Delphi umsetzen?

Robert Marquardt 5. Sep 2004 19:30

Re: Bitte eine Zeile C nach Delphi übersetzen
 
Das ist die wahrscheinlich korrekteste Version der Deklaration:
Delphi-Quellcode:
type
  Pabc = ^abc;
  abc = packed record
    def: DWORD;
    hij: array [0..ANY_SIZE-1] of DWORD;
  end;
DWORD ist in Windows.pas deklariert.
Jetzt kannst du einen geeignet langen Speicherbereich mit GetMem alloziieren und den Pointer zu einem Pabc umtypen.
Wenn du dann noch die Rangechecks ausschaltest kannst du die Elemente von hij ansprechen mit hij[I].


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr.

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