Enum und Strukturen in C

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Enum und Strukturen in C

Beitrag 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?
Zuletzt geändert von Josh am 25.05.2010 10:52, insgesamt 1-mal geändert.
Benutzeravatar
Shadow-Gamer
Beiträge: 152
Registriert: 06.09.2009 13:31
Computerausstattung: NB: Intel P8700, Mobility ATI HD4650, 4GB, Win 7

Re: Enum in C

Beitrag von Shadow-Gamer »

les doch die konstanten bei C mal aus^^
Ich versuche ja nicht faul zu sein. :)
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Enum in C

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Enum in C

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Enum in C

Beitrag 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
a²+b²=mc²
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Enum in C

Beitrag 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
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Enum und Strukturen in C

Beitrag 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.
Zuletzt geändert von Josh am 25.05.2010 11:27, insgesamt 2-mal geändert.
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Re: Enum und Strukturen in C

Beitrag 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. :)
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Enum und Strukturen in C

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Enum und Strukturen in C

Beitrag 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.
Antworten