Forum: Compiler & IDEs Compiler Warning - Enum ist kein integer const - Wieso


von Nico B. (vegetico)


Lesenswert?

Moin...
Ich hätte ne Frage zu folgendem Warning, was ich nicht verstehe:

Warning  1  enumerator value for 'channel2' is not an integer constant 
expression [-pedantic]

Das entsprechende Codestück ist unten. Kurz zur Erklärung: ich brauche 
verschiedene (8) Frequenzen für ne IR LED.
Ich berechne mit zuerst meine Freuqenzen (LED_CHANNEL) bzw. meinen 
Dutycycle der PWM - damit ich nicht immer mit defines arbeiten muß, 
wollte ich dann die 'finalen' PWM Werte für den OCR in ein enum packen.
Dabei beschwert sich aber der Kompiler mit obiger Warnung. Wie bekomme 
ich diese weg - ich kann hier doch kein const verwenden? Bzw ich weiß 
nicht wie. Oder geht das so eh nicht???

Gruß
Nico
1
//Formula Ref Man 123 CTC 8bit timer
2
//4000000/8    = 500000==> F_CPU/Prescaler
3
//500000/6250  = 80  ==> desired Frequency 
4
//80/2      = 40  ==> 80 is 'high time', but we need 50% dutycycle
5
#define LED_CHANNEL1 (((F_CPU/PRESCALER)/LED_FREQ1)/2)
6
#define LED_CHANNEL2 (((F_CPU/PRESCALER)/LED_FREQ2)/2)
7
#define LED_CHANNEL3 (((F_CPU/PRESCALER)/LED_FREQ3)/2)
8
#define LED_CHANNEL4 (((F_CPU/PRESCALER)/LED_FREQ4)/2)
9
#define LED_CHANNEL5 (((F_CPU/PRESCALER)/LED_FREQ5)/2)
10
#define LED_CHANNEL6 (((F_CPU/PRESCALER)/LED_FREQ6)/2)
11
#define LED_CHANNEL7 (((F_CPU/PRESCALER)/LED_FREQ7)/2)
12
#define LED_CHANNEL8 (((F_CPU/PRESCALER)/LED_FREQ8)/2)
13
14
#define LIGHTHOUSE OCR2
15
16
typedef enum ledChannel{
17
  channel0 = 0,
18
  channel1 = (uint8_t) LED_CHANNEL1,
19
  channel2 = (uint8_t) LED_CHANNEL2,
20
  channel3 = (uint8_t) LED_CHANNEL3,
21
  channel4 = (uint8_t) LED_CHANNEL4,
22
  channel5 = (uint8_t) LED_CHANNEL5,
23
  channel6 = (uint8_t) LED_CHANNEL6,
24
  channel7 = (uint8_t) LED_CHANNEL7,
25
  channel8 = (uint8_t) LED_CHANNEL8,
26
} ledChannel;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie sehen denn die verschiedenen Werte aus, die Du da in Deinem Macro 
verwurschtelst?
Also: F_CPU, PRESCALER und LED_FREQ1 .. LED_FREQ8


Ist die Warnung die einzige dieser Art, oder wird sie bei jeder 
einzelnen der enum-Zuweisungen ausgegeben?

von Uwe (de0508)


Lesenswert?

Das Code-Beispiel ist nicht vollständig, so kann das keiner Überprüfen.

Für mich macht die gesamte Anweisung keinen Sinn:
1
typedef enum ledChannel{
2
  channel0 = 0,
3
  channel1 = (uint8_t) LED_CHANNEL1,
4
  channel2 = (uint8_t) LED_CHANNEL2,
5
  channel3 = (uint8_t) LED_CHANNEL3,
6
  channel4 = (uint8_t) LED_CHANNEL4,
7
  channel5 = (uint8_t) LED_CHANNEL5,
8
  channel6 = (uint8_t) LED_CHANNEL6,
9
  channel7 = (uint8_t) LED_CHANNEL7,
10
  channel8 = (uint8_t) LED_CHANNEL8,
11
} ledChannel;

verwende doch ein Define.

Die Frage, die sich stellt, was willst Du damit machen ?

von Noname (Gast)


Lesenswert?

Au weia. Und das am Sonntagabend.

Erstmal:
1. Code nicht vollständig.
2. Code nicht compilierbar.

Dann:
Irreführende poetische Freiheiten bei der Benennung von defines.
"Channel" ist ein "Kanal". "Frequency" eine "Frequenz". Wenn Du nun eine 
Frequenz berechnest, warum nennst Du sie nicht auf Frequenz?

von Noname (Gast)


Lesenswert?

-auf
+auch

von Nico B. (vegetico)


Lesenswert?

Hallo,

Frequenzen sind krumm und die Warnings kommen für jedes Element des enum 
(das oben war nur ein Beispiel aus der Gruppe). Ich war bzw. bin aber 
davon ausgegangen, das der [uint8_t] cast das Ganze  'rundet' bzw. die 
Nachkommastelle abschneidet.
Und wie gesagt, ich hatte gedacht dass das enum 'netter' wäre als immer 
mit den defines zu arbeiten.
1
#define F_CPU 4000000UL
2
3
#define PRESCALER 8
4
5
#define LED_FREQ1 6250
6
#define LED_FREQ2 6644.52
7
#define LED_FREQ3 7042.25
8
#define LED_FREQ4 7434.94
9
#define LED_FREQ5 7843.13
10
#define LED_FREQ6 8230.14
11
#define LED_FREQ7 8658.01
12
#define LED_FREQ8 9049.77

von Nico B. (vegetico)


Lesenswert?

Hier nochmal der gesamte Teil des Header:
1
#define F_CPU 4000000UL
2
3
//Atmega 162 OCR2 @ DDRB PB1
4
#define LED_DDR DDRB
5
#define LED_PORT PB1
6
7
#define PRESCALER 8
8
#define LED_FREQ1 6250
9
#define LED_FREQ2 6644.52
10
#define LED_FREQ3 7042.25
11
#define LED_FREQ4 7434.94
12
#define LED_FREQ5 7843.13
13
#define LED_FREQ6 8230.14
14
#define LED_FREQ7 8658.01
15
#define LED_FREQ8 9049.77
16
17
//Formula Ref Man 123 CTC 8bit timer
18
//4000000/8    = 500000==> F_CPU/Prescaler
19
//500000/6250  = 80  ==> desired Frequency
20
//80/2      = 40  ==> 80 is 'high time', but we neet 50% dutycycle
21
#define LED_CHANNEL1 (((F_CPU/PRESCALER)/LED_FREQ1)/2)
22
#define LED_CHANNEL2 (((F_CPU/PRESCALER)/LED_FREQ2)/2)
23
#define LED_CHANNEL3 (((F_CPU/PRESCALER)/LED_FREQ3)/2)
24
#define LED_CHANNEL4 (((F_CPU/PRESCALER)/LED_FREQ4)/2)
25
#define LED_CHANNEL5 (((F_CPU/PRESCALER)/LED_FREQ5)/2)
26
#define LED_CHANNEL6 (((F_CPU/PRESCALER)/LED_FREQ6)/2)
27
#define LED_CHANNEL7 (((F_CPU/PRESCALER)/LED_FREQ7)/2)
28
#define LED_CHANNEL8 (((F_CPU/PRESCALER)/LED_FREQ8)/2)
29
30
#define LED OCR2
31
32
typedef enum ledChannel{
33
  channel0 = 0,
34
  channel1 = (uint8_t) LED_CHANNEL1,
35
  channel2 = (uint8_t) LED_CHANNEL2,
36
  channel3 = (uint8_t) LED_CHANNEL3,
37
  channel4 = (uint8_t) LED_CHANNEL4,
38
  channel5 = (uint8_t) LED_CHANNEL5,
39
  channel6 = (uint8_t) LED_CHANNEL6,
40
  channel7 = (uint8_t) LED_CHANNEL7,
41
  channel8 = (uint8_t) LED_CHANNEL8,
42
} ledChannel;

von Noname (Gast)


Lesenswert?

>Und wie gesagt, ich hatte gedacht dass das enum 'netter' wäre als immer
>mit den defines zu arbeiten.

Was heisst hier: "netter"?
Um ein geflügeltes Wort abzuwandeln: "Programmieren ist kein 
Ponyreiten".
Lass den Murks beim programmieren emotionale Entscheidungen zu treffen.

Auf der rechten Seite muss eine Integer-Konstante stehen. Und zwar zur 
Compilezeit. Das cast kannst Du Dir in die Haare schmieren.

Näheres erklärt das C-Buch Deiner Wahl.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nico B. schrieb:
> #define LED_FREQ2 6644.52
> #define LED_FREQ3 7042.25
> #define LED_FREQ4 7434.94
> #define LED_FREQ5 7843.13
> #define LED_FREQ6 8230.14
> #define LED_FREQ7 8658.01
> #define LED_FREQ8 9049.77

Runde das. Und vergleiche mal exemplarisch, ob sich die Resultate dann 
von Deinen per Floatingpoint-Arithmetik berechneten überhaupt 
unterscheiden.

von (prx) A. K. (prx)


Lesenswert?

Noname schrieb:
> Auf der rechten Seite muss eine Integer-Konstante stehen. Und zwar zur
> Compilezeit. Das cast kannst Du Dir in die Haare schmieren.

Freundlicher formuliert: Es dürfen zwar Fliesskommakonstanten 
auftauchen, zu Integers gecastet, aber keine Rechnungen mit 
Fliesskommakonstanten.

von Nico B. (vegetico)


Lesenswert?

Super, das wars...
Das heißt, der cast im enum hat die Nachkommastellen wirklich nicht 
abgeschnitten - wie NoName schon so charmant gesagt hat. Bzw es ist gar 
kein cast...
Super, die Auflösung der Frequenz braucht eh nicht so genau zu sein - da 
hatte ich grad nicht dran gedacht.
Vielen Dank euch zwei

von (prx) A. K. (prx)


Lesenswert?

Nico B. schrieb:
> Das heißt, der cast im enum hat die Nachkommastellen wirklich nicht
> abgeschnitten - wie NoName schon so charmant gesagt hat. Bzw es ist gar
> kein cast...

Doch, der cast entfernt sehr wohl die Nachkommastellen. Nur ist eine 
Rechnung mit Fliesskommawerten an dieser Stelle schlicht nicht zulässig.

Eine "integer constant expression" ist seitens der Sprachdefinition 
nicht das Gleiche wie deine "constant expression" mit ganzzahligem 
Ergebnis.

von Frank K. (Gast)


Lesenswert?

Nico B. schrieb:
> Das entsprechende Codestück ist unten. Kurz zur Erklärung: ich brauche
> verschiedene (8) Frequenzen für ne IR LED.
> Ich berechne mit zuerst meine Freuqenzen (LED_CHANNEL) bzw. meinen
> Dutycycle der PWM - damit ich nicht immer mit defines arbeiten muß,
> wollte ich dann die 'finalen' PWM Werte für den OCR in ein enum packen.

enum ist ein Aufzählungstyp und kein Feld mit Konstanten. Wie wäre es 
mit einem const array?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.