| 

.NET C# Java Javascript Exception

3
Kann mir jemand helfen, folgendes Stück C++-Code zu verstehen? (Stammt jedenfalls aus einem C++-Projekt, aber ich vermute, es würde auch in C laufen.)

typedef struct _GUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID;

...

typedef GUID UUID;

...

UUID NFAUUID = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x1F};


Mich interessiert, was in der letzten Zeile passiert: welchen Feldern der struct wird welcher Wert zugewiesen? Mir kommt die Sache etwas spanisch vor, vermutlich findet irgendeine implizite Konvertierung statt, aber so tief kenne ich mich mit C/C++ leider nicht aus.

Falls jemand gleich noch ein Beispiel hat, wie ich ein Äquivalent zu NFAUUID (d.h. einen identisch initialisierten Wert) aus C# per P/Invoke übergebe, wäre das für mich das Tüpfelchen auf's i.
09.05.2011
Matthias Hlawatsch 13,2k 4 9
Danke an alle für drei nahezu gleichwertige Antworten. Ich kann leider nur eine akzeptieren und habe mich für Dustin entschieden, weil ich den Stackoverflow-Link nützlich finde, und weil er mir mit dem Hinweis auf die Semantik von 0x1f eine Frage beantwortet hat, die ich noch gar nicht gestellt hatte ;-)
Matthias Hlawatsch 10.05.2011
Der Knackpunkt war letztlich aber für mich, das es in C offenbar möglich ist, eine struct auf die angegebene Weise mit einem Array zu initialisieren und dabei die Elemente einzeln und der Reihe nach (! Beim Gedanken daran, dass jemand mal bei einer Codeverschönerungsaktion die struct umsortiert graut es mir) den Feldern der struct zugewiesen werden.
Matthias Hlawatsch 10.05.2011
3 Antworten
3
Ich denke das struct an sich ist ja klar. Vier Variablen innerhalb des structs, sowie die direkte Deklaration von GUID als Variable vom Typ _GUID. Durch die typedef Deklaration gibst du dem zusammengesetzten Datentyp GUID den Alias UUID (siehe CPP Reference).

Die letzte Zeile deklariert nun eine neue Variable namens NFAUUID vom Typ UUID und initialisiert diese direkt. Nun könnte man mit der Dot-Notation auf die einzelnen Werte zugreifen, oder diese in der oben festgelegten Reihenfolge "befüllen".

In diesem Fall also 136, 119, 102, 'U', 'D', '3', '"' und einem sog. Einheitentrenner. Die letzten 4 chars sollten also in deinem Data4 Array gespeichert werden. Die ersten 3 Zahlen dagegen in den Variablen Data1 bis Data3.

*UPDATE*
Habe noch einen, hoffentlich, passenden Link für dich zum P/Invoken gefunden. Das Ganze kannst du mit Marshalling realisieren (siehe Stackoverflow).

Wie immer keine Gewähr :-)
09.05.2011
Dustin Klein 2,9k 2 9
Dankeschön. Das mit dem "Einheitentrenner" bezieht sich auf die Semantik von 0x1F im ASCII-Code, oder hast Du noch was anderes damit gemeint?
Matthias Hlawatsch 10.05.2011
Ne, ist nur der ASCII Code von 0x1F als Steuerungszeichen.
Dustin Klein 10.05.2011
5
NFAUUID ist eine Variable vom Typ struct _GUID, die aus 11 Elementen besteht (einem unsigned long, zwei unsigned shorts und 8 chars). Die acht Werte in den Mengenklammern werden den ersten 8 Elementen zugewiesen:

NFAUUID.Data1 == 0x88;
NFAUUID.Data2 == 0x77;
NFAUUID.Data3 == 0x66;
NFAUUID.Data4 = "\x55\x44\x33\x22\x1F\0";

Die restlichen Elemente werden mit 0 initialisiert.

Editiert: vertippt
Editiert: sind Elemente, keine Attribute (zuviel OO :-)
09.05.2011
theorist 494 6
5
Mit dem ersten typedef wird neben der Struktur _GUID auch ein neuer Typ GUID erzeugt. Dann wird ein weiterer Typ UUID aus GUID erzeugt.

Z.B. kann man auch
typedef int zahl

machen und dann sowohl
int i = 5;
als auch
zahl i = 5;
schreiben

Die Struktur hat einen Umfang von 16 Bytes => sizeof(GUID)

unsigned long => 4 Bytes (1x)
unsigned short => 2 Bytes (2x)
unsigned char => 1 Byte (8x)

also 4 + 2 * 2 + 8 * 1 = 16 Bytes


UUID NFAUUID = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x1F}; => 13 Bytes.
Die letzten 3 Bytes werden damit nicht belegt und werden mit 0 initialisiert.

Data1 = 0x00000088
Data2 = 0x0077
Data3 = 0x0066
Data4[0] = 0x55
Data4[1] = 0x44
Data4[2] = 0x33
Data4[3] = 0x22
Data4[4] = 0x1F
Data4[5] = 0
Data4[6] = 0
Data4[7] = 0
09.05.2011
Joachim 3,1k 4 9

Stelle deine Cplusplus-Frage jetzt!