mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Grösse von enums immer 8bit bei wenigen Einträgen?


Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

zum Speichern von Zuständen im EEPROM, die als enums hinterlegt sind, 
nutze ich bisher immer die eeprom_write_block - Funktion und gebe die 
Größe des enums immer an. (sizeof..)

Wenn nur max. 20 Zustände definiert wurden, kann dann immer davon 
ausgegangen werden, dass diese 8bit groß sind? Oder ist das zu riskant?

ShortEnums ist aktiviert..

Gruß
Bernhard?

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anders herum wird ein Schuh draus.
Wenn "ShortEnums" aktiviert ist, haben alle enums 8 bit, egal ob 20 
oder 300 Zustände dargestellt werden sollen.

Aber wie groß dein Enum nun ist, erfährt dein Compiler durch sizeof. 
Diese "Funktion" wird nicht zur Laufzeit ausgeführt, sondern von deinem 
Compiler durch eine Konstante ersätzt.

Autor: bernieserver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sizeof während Compilierung einsetzt ist mir bekannt.

Aber wie sollen mit short enums denn 300 Zustände abgebildet werden?


Gruß
Bernhard

Autor: bernieserver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ich denke die enums werden so groß wie gerade nötig, abhängig der 
Anzahl Elemente:


http://www.avrfreaks.net/index.php?name=PNphpBB2&f...


Gruß
Bernhard

Autor: Michael Schikora (schiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernhard N. schrieb:
> Hallo,
>
> zum Speichern von Zuständen im EEPROM, die als enums hinterlegt sind,
> nutze ich bisher immer die eeprom_write_block - Funktion und gebe die
> Größe des enums immer an. (sizeof..)
>
> Wenn nur max. 20 Zustände definiert wurden, kann dann immer davon
> ausgegangen werden, dass diese 8bit groß sind? Oder ist das zu riskant?
>
> ShortEnums ist aktiviert..

Theoretisch ja, praktisch hat eine Version angeblich immer 16 Bit 
verwendet. (Meiner 20100110 funktioniert, sizeof myEnum==1 bzw. ab 
MyEnumValue=256, 2)
Die Durchnummerierung von 0.. sollte aber immer gewährleistet sein.
Schreib doch einfach nur das erste Byte ins Eeprom.

@Volker:
Nein, der Compiler versucht erst mit 8, dann 16, dann 32 klarzukommen.

Schiko

Autor: bernieserver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.

Ist es eigentlich egal, ob ich bei sizeof() den Datentyp vorgebe oder 
die derzeitig genutzte Variable des selben Typs? Erzeugt dies 
unterschiedliche Verhalten?


Gruß
Bernhard

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die sind gleich.
Du kannst es machen wie du willst: Typ oder Variable.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst auch Ausdrücke reinschreiben, wenn du jemanden verwirren 
willst:
    sizeof(789221/4)
liefert die Größe einer int.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Schikora schrieb:
> Nein, der Compiler versucht erst mit 8, dann 16, dann 32 klarzukommen.

Falsch.
Dieses macht der GCC so. Andere Compiler machen dieses nicht so.

Ich glaube auch nicht, das das so in Cxx steht.

Da nicht bekannt ist welchen Compiler benutzt wird gehe ich vom C90 aus. 
(Das unterstützt eigendlich jeder Compiler.)

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Du kannst es machen wie du willst: Typ oder Variable.

clevererweise benutzt man die Variable, da braucht man nämlich nur an 
einer Stelle etwas ändern, wenn man den Typ ändert.


zur Ermittlung der Größe darf man auch ruhig undefinierte Pointer 
dereferenzieren, da den compiler hier nur der Typ interessiert.

Point* p;

sendDebugData(p, sizeof(*p));

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> clevererweise benutzt man die Variable, da braucht man nämlich nur an
> einer Stelle etwas ändern, wenn man den Typ ändert.

richtig, solange man überhaupt eine hat.

Autor: bernieserver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für die zahlreichen Antworten.

Ich werde in Zukunft bei enums immer die eeprom_write_block mit sizeof 
(enum_t) oder sizeof(enum_var) nehmen, je nach dem, da es ja egal ist.


Gruß
Bernhard Nöst

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Die sind gleich.
> Du kannst es machen wie du willst: Typ oder Variable.

Achtung Korinthenkackerei: Das Ergebnis ist natürlich gleich. Aber die 
Klammern sind nur bei Typen nötig.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, hatte ich vergessen zu erwähnen.

Dann gleich eine Korinthe mehr:
rein stilmäßig finde ich sie bei Ausdrücken aber trotzdem ratsam.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.