Compiler Warning - Enum ist kein integer const - Wieso

OP #2747283
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;
#2747294
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 ?
Gast #2747309
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?
OP #2747315
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
OP #2747322
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;
Gast #2747349
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.
Persönliche Seite #2747358
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.
OP #2747375
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
#2747383
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.
Gast #2747393
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren