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