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
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?
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?
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.
>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.
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.
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.
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
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.
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?