Seite 1 von 2

Enum und Strukturen in C

Verfasst: 24.05.2010 23:08
von Josh
sind enums in C/C++, bei denen keine werte angegeben sind immer nullbasiert?

Code: Alles auswählen

typedef enum tagFUNCKIND {
	FUNC_VIRTUAL,FUNC_PUREVIRTUAL,FUNC_NONVIRTUAL,
	FUNC_STATIC,FUNC_DISPATCH
}FUNCKIND;

Code: Alles auswählen

Enumeration
  #FUNC_VIRTUAL
  #FUNC_PUREVIRTUAL
  #FUNC_NONVIRTUAL
  #FUNC_STATIC
  #FUNC_DISPATCH
EndEnumeration
entspricht dieser pb-code dem obigen c-code?

Re: Enum in C

Verfasst: 24.05.2010 23:22
von Shadow-Gamer
les doch die konstanten bei C mal aus^^

Re: Enum in C

Verfasst: 24.05.2010 23:38
von Josh
Shadow-Gamer hat geschrieben:les doch die konstanten bei C mal aus^^
wenn ich C hätte :lol:
ich hab hier nur jede menge .h dateien, die oft eine große hilfe sind, obwohl ich nicht immer alles verstehe.

Re: Enum in C

Verfasst: 24.05.2010 23:51
von ts-soft
Josh hat geschrieben:wenn ich C hätte :lol:
Aber PB haste? Wenn ja, dann sollte sich im SDK ein HeaderConverter befinden!
Auch wenn dieser nicht alles korrekt macht :lol: , solltest Du sehen können,
was mit den Enums passiert.

Re: Enum in C

Verfasst: 24.05.2010 23:54
von Kiffi
Josh hat geschrieben:entspricht dieser pb-code dem obigen c-code?
wenn ich mir die Enumeration von aXend anschaue, dann sieht
das ziemlich identisch aus :-)

Grüße ... Kiffi

Re: Enum in C

Verfasst: 25.05.2010 00:22
von Josh
ts-soft hat geschrieben:Aber PB haste? Wenn ja, dann sollte sich im SDK ein HeaderConverter befinden!
Auch wenn dieser nicht alles korrekt macht :lol: , solltest Du sehen können,
was mit den Enums passiert.
OMG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
was es nicht alles gibt. da hätte ich mir schon viel rätselraten ersparen könne :o

auf jeden fall, danke an alle

Re: Enum und Strukturen in C

Verfasst: 25.05.2010 10:59
von Josh
jezt hab ich noch eine frage zu den sturkturen in C. habe den titel dieses threads entsprechend geändert.

es geht eigentlich um die größe von strukturen. ich habe schon öfter in pb-codes gesehen, dass da füllvariablen in strukturen (die aus C kommen) eingesetzt werden. jetzt hab ich mich doch mal ein bischen mit C gespielt und hab folgendes beispiel zusammengebastelt.

Code: Alles auswählen

#include <iostream.h>

int main ()
{

    struct TEST 
    { 
      long  dwEinDoubleWord; 
      short wEinWord; 
    }; 
    
    cout<<"Size of Header = "<<sizeof(TEST)<<endl;
    
    system("PAUSE>nul");
    return EXIT_SUCCESS;
}
interessanterweise bekomme ich für sizeof folgende ergebnisse:

2 byte wenn ich nur die shortvariable in der strukt habe
4 byte wenn ich nur die longvariable in der strukt habe
8 byte wenn ich short und long in der strukt habe

kann mir bitte einer erklären, warum 2 + 4 gemeinsam ein ergebnis von 8 ergibt? wahrscheinlich ist das auch der grund, warum diese füllvariablen in pb notwendig sind.

Re: Enum und Strukturen in C

Verfasst: 25.05.2010 11:18
von Blackskyliner
Wenn ich mich recht entsinne sind es am Ende eh alles integer, nur halt dann entsprechend nur gemasked, also so, dass man nur auf den oberen oder unteren Teil zugreifen kann... Sicher bin ich mir aber nicht... Aber deine Frage ist gut gestellt... Kommt aber unter anderem auch auf das System an... Weil je nachdem ob du 64 oder 32 bit hast, kannste mit den Tabellarischen Größen nicht unbedingt was anfangen weil es sein kann das ein short auf einem x64 einem long auf x86 entspricht... Was dann allerdings die Frage stellt warum der long dann so klein ist. :)

Re: Enum und Strukturen in C

Verfasst: 25.05.2010 11:24
von Josh
ach so, hab ich vergessen. in diesem fall interessieren mich momentan nur 32bit maschinen.

trotzdem ist es komisch, dass der short weiß, dass er zwei byte lang ist, wenn er alleine steht, in zusammenhang mit einer long dann aber größer wird. für mich wäre es wichtig, ein system zu erkennen, damit ich die pb-strukturen entsprechend auslegen kann.

Re: Enum und Strukturen in C

Verfasst: 25.05.2010 11:34
von NicTheQuick
Das hängt mit dem Memory Alignment zusammen. Wenn du eine 32-Bit CPU hast, hast du normalerweise auch einen 32-Bit Datenbus zum Arbeitsspeicher. Um Daten aus dem Arbeitsspeicher zu bekommen, muss die CPU also ein Offset angeben und bekommt dann die 32 Bit an dieser Position im Arbeitsspeicher. Aber dieses Offset ist nicht Byte-weise, sondern Registergrößen-weise. Das heißt an Offset 0 stehen die ersten 32 Bit, an Offset 1 die nächsten 32 Bit, usw.

Wenn man eine Struktur dann so aufbaut, dass jedes Element genau der Registergröße entspricht, dann ist es ein leichtes an diesen Wert zu kommen.
Hättest du jetzt allerdings eine Struktur mit dem Aufbau "short, long", dann wäre die Verteilung ohne Alignment im Speicher so:

Code: Alles auswählen

Offset  0                   1
Byte    0    1    2    3    4    5   
        aaaa aaaa bbbb bbbb bbbb bbbb

a = short
b = long
Will jetzt die CPU b auslesen, müsste sie zuerst den Wert an Offset 0 auslesen, dann an Offset 1 und die beiden Werte dann shiften und ver-ODER-n, damit es ihn im Register liegen hat.
Mit MemoryAlignment wird alles schon vorher richtig gerückt.

Code: Alles auswählen

Offset  0                   1
Byte    0    1    2    3    4    5    6    7
        aaaa aaaa ???? ???? bbbb bbbb bbbb bbbb

a = short
b = long
Die Variable a liegt an Offset 0 und Variable b an Offset 1. Mit einem Rutsch sind die dann ausgelesen.