Sida 1 av 2

Storlek på enumeration och hjälp med en funktion

Postat: 31 mars 2017, 15:16:31
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);
}

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

Postat: 31 mars 2017, 15:29:57
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.

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

Postat: 31 mars 2017, 15:59:11
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.

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

Postat: 31 mars 2017, 16:24:20
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 :)

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

Postat: 31 mars 2017, 16:32:53
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.

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

Postat: 31 mars 2017, 16:37:25
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;

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

Postat: 31 mars 2017, 16:40:22
av lillahuset
Jag menade i funktionsdefinitionen. Det borde finas någon här som vet mer om enum. :)

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

Postat: 31 mars 2017, 16:58:42
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

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

Postat: 31 mars 2017, 17:03:43
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!

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

Postat: 31 mars 2017, 17:45:40
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.

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

Postat: 31 mars 2017, 19:37:55
av Micke_s
Enum ska vara INT enligt C99.

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

Postat: 31 mars 2017, 19:49:17
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:

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

Postat: 31 mars 2017, 20:04:09
av TomasL
Och vad har det med saken att göra, gcc följer inte standarden heller, trots att den är fri.

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

Postat: 31 mars 2017, 20:08:31
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.

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

Postat: 31 mars 2017, 20:18:28
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.