Storlek på enumeration och hjälp med en funktion

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Storlek på enumeration och hjälp med en funktion

Inlägg av Magnus_K »

Hej hej,

Det är inte längesen jag började använda mig av enums och när man väl börjar få kläm på det så är det helt fantastiskt bra tycker jag. Dock har jag en fråga någon kanske kan hjälpa mig med.

Jag har en funktion enligt nedan som jag vill skicka en parameter till, en enum. Oavsett om jag använder uint8_t eller uint16_t som parameter så kompilerar det utan fel.
Detta gör mig lite förundrad, vad är det för storlek på "enums"? Sätts storleken utefter antal när man kompilerar, fast då max som en long enligt nedan?

Hjälpen i mitt IDE säger:
In the mikroC PRO for PIC, a variable of an enumerated type can be assigned any value of the type int – no type checking beyond that is enforced.
Kikar jag sedan på int så säger hjälpen: The types char and int, together with their variants, are considered to be integral data types. Variants are created by using one of the prefix modifiers short, long, signed and unsigned.

Kod: Markera allt

enum buzzLengths {
   SHORT,
   LONG
};

enum buzzLengths buzzLength = SHORT;

void do_buzz(uint8_t buzzlength){    // <------- Här kompilerar både uint8_t och uint16_t utan problem
   ...code...
}

void main(){
   do_buzz(LONG);
}
Senast redigerad av Magnus_K 31 mars 2017, 16:37:42, redigerad totalt 1 gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av lillahuset »

Själv gillar jag (av någon anledning) inte enum och använder dem aldrig. Fast de anses bra.

Om jag fattat rätt så är en enum en vanlig heltalskonstant som i normalfallet börjar med 0. Om du är riktigt strebrig kan du definiera fler än 128 st och jag gissar att du då behöver en int_16 eller int för att lagra den. Om du använder enum så använd den som en int.
datajompa
Inlägg: 232
Blev medlem: 5 november 2010, 10:35:54

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av datajompa »

https://download.mikroe.com/documents/c ... stants.htm
"Enumeration size is calculated according to the enumerators (enumeration elements)."

Detta är tyvärr i enlighet med C89-standarden som jag fått för mig att MicroC mer eller mindre följer. Där står att läsa https://web.archive.org/web/20030222051 ... ts/c89.txt
"Each enumerated type shall be compatible with an integer type; the choice of type is implementation-defined."

Så dom får göra hur dom vill, och förmodligen använder dom den minsta typen som passar eftersom det är en bra optimering för en microcontroller som ju har mycket begränsat med minne. I ditt fall ser det ju ut som att det blir en char, och i C11 får en enum bli antingen en int eller en char.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av Magnus_K »

Tack för jättebra svar.

I mitt fall spelar det kanske inte så stor roll men jag vet alltså inte säkert vilken typ av parameter jag ska skicka till funktionen? Det kan ju likaväl vara en signed som unsigned, int eller char.
Eller ja, vettigt folk kanske inte ens använder enums på det här sättet :)
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av lillahuset »

Om du använder typen "enum buzzLengths" borde du få viss typcheck av kompilatorn. Jag har för mig att det är så med GCC.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av Magnus_K »

Ber om ursäkt, missade en rad kod. Denna är nu redigerad in i första inlägget men nedan är den.
Utan den raden så brukar jag få ett kompileringsfel som jag inte lyckas återfå nu :humm:

Kod: Markera allt

enum buzzLengths buzzLength = SHORT;
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av lillahuset »

Jag menade i funktionsdefinitionen. Det borde finas någon här som vet mer om enum. :)
Användarvisningsbild
adent
Inlägg: 4100
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av adent »

Ska man göra rätt ska din funktion så klart ta emot en enum. Så här:

Kod: Markera allt

    enum buzzLengths {
       SHORT,
       LONG
    };
     
    enum buzzLengths buzzLength = SHORT;
     
    void do_buzz(enum buzzLengths buzzlength){    // <------- Här kompilerar både uint8_t och uint16_t utan problem
       ...code...
    }
     
    void main(){
       do_buzz(LONG);
    }
MVH: Mikael
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av Magnus_K »

Ahaaaaa, snyggt adent :tumupp:

Då känns det som att det löser sig själv. Det kompilerade bra och kommer säkert fungera kanon!
Användarvisningsbild
pbgp
Inlägg: 1447
Blev medlem: 11 november 2010, 09:09:22
Ort: Uppsala
Kontakt:

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av pbgp »

Du kan ju också sätta ett högt startvärde på enum:en och se vad som händer. Om du är nyfiken menar jag.

Kod: Markera allt

    enum buzzLengths {
       SHORT = CHAR_MAX +1,
       LONG
    };
Du kan nog behöva inkludera "limits.h" för CHAR_MAX. Prova 256 annars.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av Micke_s »

Enum ska vara INT enligt C99.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av lillahuset »

Tyvärr är det ganska många kompilatorer som struntar i standarder. Jag vet inte om det är sant men jag har läst att MS inte har någon kompilator som uppfyller C11. Och tydligen inte ens C99. :lol:
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45270
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av TomasL »

Och vad har det med saken att göra, gcc följer inte standarden heller, trots att den är fri.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45270
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av TomasL »

Dock, du kan nog utgå ifrån att enum är en int, om du inte specificerar ett värde större än vad en int tillåter.
Vad en int innebär i antalet bytes, beror på dit system.
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Storlek på enumeration och hjälp med en funktion

Inlägg av Mr Andersson »

Micke_s skrev:Enum ska vara INT enligt C99.
Ja det stämmer, men är också ganska irrelevant i det här specifika fallet då vi pratar om implicit cast från enum till andra typer.
Each enumerated type shall be compatible with char, a signed integer type, or an
unsigned integer type. The choice of type is implementation-defined,110) but shall be
capable of representing the values of all the members of the enumeration.

110) An implementation may delay the choice of which integer type until all enumeration constants have been seen.
Det är alltså upp till kompilatortillverkaren att välja typ.
Skriv svar