PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Records mit Arrays – wie? (C -> Delphi) Neu: Frage zu Typedef Enum


aths
2011-11-15, 14:21:26
Ich habe ungefähr folgenden C-Code (gekürzt)


typedef struct
{
NvU32 version;
NvU32 count;
struct
{
NvU32 defaultMinLevel;
NvU32 defaultMaxLevel;
NvU32 currentLevel;
}
cooler[3];
}
NV_SETTINGS_V3;


Wenn ich das richtig sehe, ist innerhalb der Struct eine Unter-Struct als Array angelegt. Wie formuliert man diesen Type als Record in Delphi?


edit: Typedef-Enum-Frage in Post #3.

Nagelbrett
2011-11-15, 14:49:49
Spontan würde ich sagen:type NV_SETTINGS_V3 = record
version: NvU32;
count: NvU32;
type TSubRecord = record
defaultMinLevel: NvU32;
defaultMaxLevel: NvU32;
currentLevel: NvU32;
end;
cooler: Array[0..2] of TSubRecord;
end;

aths
2011-11-15, 15:26:18
Danke, bis auf ein Zeichen klappt das so weit.

Neues Problem: In einem Record habe ich im C-Code den Typ NV_POLICY. Gekürzter Quellcode:

typedef enum
{
NV_POLICY_NONE = 0x00000000,
NV_POLICY_MANUAL = 0x00000001,
NV_POLICY_PERF = 0x00000002,
} NV_POLICY;


Kann man in Delphi statt des Typedef Enums einfach einen Integer nutzen? Wenn ja, wie groß müsste der sein? 64 Bit wie "0x00000001" suggeriert, oder beansprucht dieser Typ im Record lediglich ein Byte, da ein Byte ausreicht, diese Konstanten durchzunummerieren? Mir ist also nicht ganz klar, was Typdef Enum macht. Sind es in diesem Fall lediglich Alternativnamen für 64-Bit-Integers?

Nagelbrett
2011-11-15, 15:35:10
Ich glaube in C sind enums normale ints, also 32bit. Kann mich aber irren.

Edit: hab nochmal nachgelesen, im C99 Standard steht folgendes:
6.7.2.2 Enumeration specifiers
[...]
Constraints
The expression that defines the value of an enumeration constant shall be an integer constant expression that has a value representable as an int.
[...]
Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined, but shall be capable of representing the values of all the members of the enumeration.
Wieviel Platz ein Enum tatsächlich belegt, hängt also wohl vom Compiler ab. GCC macht daraus auch 8- oder 16bit Typen, wenn nicht mehr Platz benötigt wird (kann mit dem -fno-short-enums Flags verhindert werden).
Ist natürlich etwas unschön, wenn man Structs übertragen möchte, aber ich schätze, da lässt sich durch Probieren herausfinden, wie lang die dort sind.

aths
2011-11-15, 15:48:41
edit: Ich sehe gerade, was zum Heulen ist, noch seltsamere Typdef-Enum-Deklarationen, die einer Bezeichnung keine Konstante zuweisen. Funktioneirt Typedef Enum so, dass der Wert ein Zeiger auf die Liste darstellt?

Coda
2011-11-15, 16:46:24
Beispiel?

Enums haben in C einen eigenen Namensraum wie Structs. Das typedef bewirkt nur, dass der Name auch global unter dem spezifizierten Name verfügbar ist.

Sonst musst du es so referenzieren:
enum Bla { X, Y, Z };
enum Bla test;

Andernfalls:
typedef enum { X, Y, Z } Bla;
Bla test;

Das ist einer der furchtbaren Punkte an C. C++ hat das zum Glück rausgeschmissen.

Und enums können frei zu int gecasted werden. Du kannst einfach die Zahlen nehmen. Fangen bei 0 an, wenn nicht anders spezifiziert und werden dann mit jedem neuen Element um 1 hochgezählt, falls nicht anders angegeben.

In meinem Beispiel wäre X = 0 und Z = 2. Klar?

Komplexer:
enum {
A = 3,
B = 2,
C, // C = 3
D = 3, // D = 3!
E // E = 4
};

Falls du Enums an eine Funktion übergeben musst und dafür in Delphi die Spezifikation brauchst nimm den gleichen Typ wie für int. Das sollte bei jeder verbreiteten C-ABI funktionieren.

aths
2011-11-15, 19:51:11
Danke soweit, ich versuche es erst mal mit Integers.