www.mikrocontroller.net

Forum: Compiler & IDEs Enum Warnung


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bekomme bei folgender Zeile immer eine Warnung:

enum EWochentag   {          NODAY = 0,
             MONTAG,
             DIENSTAG,
             MITTWOCH,
             DONNERSTAG,
             FREITAG,
             SAMSTAG,
             SONNTAG
   };

eWochentag = u8_I2cTranceiverBuffer[0];

Warning[Pe188]: enumerated type mixed with another type

Wie bekomme ich diese weg. Ich benutze den IAR Compiler.

Danke

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auszug aus der C++-Doku:

The underlying type of an enumeration is an integral type that can 
represent all the enumerator values defined in the enumeration.
If no integral type can represent all the enumerator values, the 
enumeration is ill-formed. It is implementationdefined
which integral type is used as the underlying type for an enumeration 
except that the underlying type shall not
be larger than int unless the value of an enumerator cannot fit in an 
int or unsigned int. If the enumerator-list
is empty, the underlying type is as if the enumeration had a single 
enumerator with value 0. The value of sizeof()
applied to an enumeration type, an object of enumeration type, or an 
enumerator, is the value of sizeof() applied to
the underlying type.

Es ist also nicht klar, welcher Datentyp hinter Deinem enum liegt. 
Zuweisungen von anderen Datentypen zu Enums sind eigentlich verboten.

Ich würde vorschlagen, die Tage als defines abzulegen
#define NODAY 0
#define MONTAG 1
#define DIENSTAG 2
...

und dann eWochentag als entspr. integralen Datentyp (z.B. int oder char) 
zu definieren.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst einen Cast.

eWochentag = (EWochentag) u8_I2cTranceiverBuffer[0];

Im Gegensatz zu Florian glaube ich dass es schon sinnvoll sein kann, 
enums anstelle von Defines und ints zu verwenden.
Dies nur wenn es wenige Stellen im Programm gibt, an denen solche Casts 
wie oben nötig sind und ansonsten immer nur Variablen vom Type 
EWochentag untereinander zugeweisen werden.

Ein Problem mit Enums auf 8 Bit uC könnte noch die Platzverschwendung 
sein, wenn die Enums wie definert auf integer gemappt werden (= 16 Bit).

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Klaus,

ich habe das mal ausprobiert, leider klappt es nicht. Er sagt das er 
EWochentag nicht kennt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> enum EWochentag   {          NODAY = 0,
> eWochentag = u8_I2cTranceiverBuffer[0];
... passt halt nicht zusammen: EWochentag != eWochentag.

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht probierst Du es einmal so:

typedef enum     {
       NODAY = 0,
             MONTAG,
             DIENSTAG,
             MITTWOCH,
             DONNERSTAG,
             FREITAG,
             SAMSTAG,
             SONNTAG
   } EWochentag;

int main(void)
{
  char u8_I2cTranceiverBuffer[10];
  EWochentag eWochentag;

  eWochentag = (EWochentag) u8_I2cTranceiverBuffer[0];
  return 0;
}

Autor: Leopold B. (leo1969)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich eben selbst auch nach einer Lösung gesucht habe.
#pragma diag_suppress=Pe188
eWochentag = u8_I2cTranceiverBuffer[0];

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

naja Leopold, einfach die Meldung abschalten?

Der enum wird eingesetzt, weil man die Typ-Prüfung wünscht. Da muss es 
einen guten Grund geben, warum ich sie nicht nutzt. Also wenn überhaupt, 
dann ein cast.

tschü Dude

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.