mikrocontroller.net

Forum: Compiler & IDEs Größe von "enums" im AVR GCC


Autor: Enumerator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hoffe ihr könnt mir helfen.
Ich habe ein sehr kurioses Verhalten meiner Software auf meinem 
Controller.
Bin schon sehr lange am Suchen.

Ich benutze Enumeratoren für die Indizierung verschiedener Dinge. Und 
ich denke, dass mein Problem auf meinen Enumerator zurück zu führen ist.

Wenn ich einen Enumerator anlege, wie groß ist der. 8- bit, 16- bit?
Ich glaube nämlich, dass ich irgendwo einen Überlauf habe.

Oder kann ich das im GCC beeinflussen, gibts da einen Compiler- 
Schalter.

Danke für eure Hilfe!

Gruß

P.S. Benutze den XMega128A1 und Eclipse mit GCC

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enumerator schrieb:

> Wenn ich einen Enumerator anlege, wie groß ist der. 8- bit, 16- bit?

Standardmäßig so groß wie der Typ "int".

> Ich glaube nämlich, dass ich irgendwo einen Überlauf habe.

Wie kann man bei einem enum einen Überlauf haben?  Die einzelnen
Elemente sind doch explizit benannt, wenn man wirklich so viele
hat, dass die nicht mehr in den Datentyp passen, müsste der
Compiler meckern.

> Oder kann ich das im GCC beeinflussen, gibts da einen Compiler-
> Schalter.

Man kann den Standard durch __attribute__((packed)) (alternativ durch
den Compilerschalter -fshort-enums) dahingehend abändern, dass er nur
die minimal notwendige Größe benutzt, die sich aus der Anzahl der
aufgezählten Elemente ergibt.

Autor: Enumerator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie kann man bei einem enum einen Überlauf haben?  Die einzelnen
>Elemente sind doch explizit benannt, wenn man wirklich so viele
>hat, dass die nicht mehr in den Datentyp passen, müsste der
>Compiler meckern.

Du hast schon recht, so war es gemeint. Der Compiler meckert, du hast 
recht. Ich hab es probiert.

>Man kann den Standard durch __attribute__((packed)) (alternativ durch
>den Compilerschalter -fshort-enums) dahingehend abändern, dass er nur
>die minimal notwendige Größe benutzt, die sich aus der Anzahl der
>aufgezählten Elemente ergibt.

Das hab ich mittlerweile auch gefunden, dass die Erweiterung 
-fshort-enums eingebunden ist. Kann das Probleme machen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Enumerator schrieb:

> Das hab ich mittlerweile auch gefunden, dass die Erweiterung
> -fshort-enums eingebunden ist. Kann das Probleme machen?

Es kann Kompatibilitätsprobleme machen, wenn du gegen Bibliotheken
linkst, die nicht auf diese Weise compiliert worden sind.  (Die
avr-libc selbst enthält keine Funktionen, die irgendwo mit enums
arbeiten, ist insofern also unkritisch.)

Generell halte ich von dieser Art "tuning" per Compilerschaltern
wenig.  In einer anderen Umgebung compiliert, und nichts geht mehr.
Das __attribute__((packed)) ist dagegen eindeutig im Code und
unabhängig von den Optionen.

Allerdings sollte auch bei -fshort-enums (oder dem entsprechenden
Attribut) automatisch die nächstgrößere Wahl getroffen werden, wenn
die Anzahl der Elemente nicht mehr in den kleinsten möglichen Typ
passt.

Was jedoch nicht möglich ist ist, einen enum mit mehr als der Größe
von "int" anzulegen.  Da man in der Regel die negativen Werte nicht
mit benutzen wird (die Nummerierung fängt ja bei 0 an), limitiert
das die Zahl der Elemente auf 32767 (beim AVR-GCC).

Autor: Enumerator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast schon recht, ich weiß aber nicht wie ich es sonst lösen soll. 
Ich möchte auch nicht mein ganzes Projekt umschreiben. Ich habe 
natürlich Funktionen, die einen Enumerator erwarten, mache ich oft.

Die 32767 reichen mir ja dicke aus, jedoch 255 halt nicht. Und wenn der 
Compiler den enum nur 8-bit breit anlegt, dann reicht es eben nicht. 
Aber wenn ich es richtig verstanden habe, passt er es mit der 
Erweiterung -fshort sowieso immer an.

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.