Hi Forengemeinde,
ich bin sicher kein C-Profi, versuche aber immer mal hier ein Stück zu
lernen.
Nun erzeugt mir der Compiler bei der untenstehenden Case-Schleife eine
Fehlermeldung:
E:\C Projekte\Test.c(368) : error C2051: case expression not constant
E:\C Projekte\Test.c(380) : error C2051: case expression not constant
Error executing cl.exe.
Test.exe - 2 error(s), 0 warning(s)
1
switch(Nachricht)
2
{
3
caseWM_CREATE:
4
{
5
InitCommonControls();
6
7
SetTimer(Fenster,Timer1,1000,(TIMERPROC)NULL);
8
SetTimer(Fenster,Timer2,10000,(TIMERPROC)NULL);
9
break;
10
}
11
}
12
13
caseWM_COMMAND:
14
switch(W_Parameter)
15
{
16
caseWM_TIMER:
17
switch(W_Parameter)
18
{
19
caseTimer1:-<Fehler
20
// process the 60-second timer
21
if(RS232connect_fault==TRUE)
22
{
23
Serial_Init;
24
}
25
else
26
{
27
Serial_DataIst();
28
}
29
return0;
30
31
caseTimer2:-<Fehler
32
// process the five-minute timer
33
34
return0;
35
}
36
break;
Den Code habe ich für hier zusammenkopiert, da das Projekt bereits
mehrere 100 Zeilen hat, und alles nicht unbedingt für jeden 'genial'
geschrieben ist.
Warum werden hier Fehler erzeugt? - und wie geht es richtig?
Die Fehlerzeilen habe ich mit -< Fehler markiert
Danke für eure Hilfe
If-Schleifen sind ja nun altbekannt, aber eine case-Schleife ist mal was
neues.
Egal.
Die Fehlermeldung besagt, daß die case-Werte keine Konstanten sind. C
erlaubt da nur echte Konstantem (wie 1, 2, 3).
Oliver
Hi c-Zwerg,
was steckt denn hinter "Timer1/2"? Hier darf nur eine Konstante stehen.
Zeig uns doch noch die Deklarationen / Definitionen zu diesem
Code-Schnipsel.
Bei den übrigen case-Argumenten scheinen ja Defines benutzt worden zu
sein (Großschreibung). Wie sind Timer1 und Timer2 definiert?
Hoschti
Thomas Z. schrieb:> WM_TIMER ist eine Windows Konstante Timer2 irgend was anderes
Ist ja klar. WM_TIMER ist eine Nachricht von Windows.
Ich habe ja mit:
SetTimer (Fenster,Timer1,1000, (TIMERPROC) NULL);
SetTimer (Fenster,Timer2,10000, (TIMERPROC) NULL);
2 Timer initialisiert
Dies steht ja auch in meinem Listing (Code).
Laut Beispiel von Microsoft (siehe Link) sollte das auch so
funktionieren.
Nur sagt mir dann der C-Compiler 'Timer1' und 'Timer2' : error C2051:
case expression not constant
Die beiden Timer werden doch meiner Meinung mit 'SetTimer'
initialisiert.
Microsoft hat dies aber so im Beispiel. Schau Dir doch bitte das
Beispiel von MS an. Das sollte doch gleich mit meinem Code sein.
Was läuft falsch?
Lies einfach mal ein gutes C Buch.
Schau die an, wie die Switch Anweisung funktioniert.
Der Ausdruck hinter Case muss konstant sein, also z.B. 5.
oder wenn es
#define WM_TIMER 5
definiert ist.
Was ist aber Timer1 ?
In dem sichtbaren Teil ist der nirgends definiert.
Wenn das aber ein
int Timer1;
oder ähnliches ist, dann ist das eine Variable.
Wenn du das vergleichen möchtest, ist in C ein if() notwendig.
So wurde nun mal die Sprache in den 70er definiert.
Wie schon gesagt: vor dem Programmieren steht normalerweise die Lektüre.
PC-Freak schrieb:> Nur sagt mir dann der C-Compiler 'Timer1' und 'Timer2' : error C2051:> case expression not constant> Die beiden Timer werden doch meiner Meinung mit 'SetTimer'> initialisiert.> Microsoft hat dies aber so im Beispiel. Schau Dir doch bitte das> Beispiel von MS an. Das sollte doch gleich mit meinem Code sein.>> Was läuft falsch?
Ist das denn so schwer zu verstehen? Timer1 und Timer2 müssen
Konstanten sein, weil in einer case-Anweisung nur Konstanten erlaubt
sind. Es sind aber offenbar keine Konstanten, daher sagt der Compiler,
dass sie keine Konstanten sind.
C-Zwerg schrieb:> Was erzeugt SetTimer?> Und warum ist das nun nicht mit Case verarbeitbar?
SetTimer erzeugt die "Dinger" namens Timer1 und Timer2 nicht. Es
verwendet sie nur. Erzeugen tust du sie offenbar irgendwo, nur leider
verrätst du nicht, wie. Offenbar aber nicht als Konstanten.
So triviale Sachen kenne ich ja.
An anderen Stellen funktioniert es auch mit dem case.
1
caseWM_COMMAND:
2
switch(W_Parameter)
3
{
4
caseIDD_ParameterSetzen:
5
AkkuParameter();
6
return(0);
7
8
caseIDD_Info:
9
Info2();
10
return(0);
11
12
caseIDD_Darstellung:
13
Zoomfaktor();
14
return(0);
15
16
caseIDD_EINST_RS232:
17
Schnittstelle();
18
return(0);
19
20
caseIDD_EINST_Grenzwerte:
21
Grenzwerte();
22
return(0);
23
24
// ****** Farben ******
25
caseID_FARBEN_SCHWARZ:
26
SetClassLong(ZeichenFenster,GCL_HBRBACKGROUND,
27
(LONG)GetStockObject(BLACK_BRUSH));
28
29
InvalidateRect(ZeichenFenster,NULL,TRUE);
30
Kurve_restaurieren(ZeichenFenster);
31
return(0);
32
.....
Das mit den beiden Timern habe ich ja hier raus:
Link:https://docs.microsoft.com/en-us/windows/win32/winmsg/using-timers
Nur habe ich dann 'W_Param' aus dem Beispiel an meine Structur
angepasst.
Weiter oben habe ich ja den Code wo Timer1 und Timer2 initialisiert
werden reingestellt.
Vorher hatte ich nur einen Timer gehabt, und dann lief das problemlos
Hier der ältere Code
1
caseWM_PAINT:
2
....
3
break;
4
caseWM_TIMER:
5
if(RS232connect_fault==TRUE)
6
{
7
Serial_Init;
8
}
9
else
10
{
11
Serial_DataIst();
12
}
13
Kurve_zeichnen(ZeichenFenster);
14
break;
15
case....
Die ganze Haupt-Nachrichtenschleife läuft mit case-Anweisungen.
Aber nur hier mit den 2 Timern meckert der Compiler.
C-Zwerg schrieb:> Weiter oben habe ich ja den Code wo Timer1 und Timer2 initialisiert> werden reingestellt.
Nein, hast du nicht. Du hast nur den Code gezeigt, wo sie benutzt
werden.
C-Zwerg schrieb:> SetTimer (Fenster,Timer1,1000, (TIMERPROC) NULL);
Hier übergibst du das irgendwo vorher in irgendeiner Form definierte
"Timer1" an die Funktion SetTimer, die den Wert dann benutzt.
> Vorher hatte ich nur einen Timer gehabt, und dann lief das problemlos
Da ist das beanstandete switch/case ja auch gar nicht drin.
> Aber nur hier mit den 2 Timern meckert der Compiler.
Zum letzten mal: Weil du etwas, das keine Konstante ist, in einer
case-Anweisung verwendet.
C-Zwerg schrieb:> Aber nur hier mit den 2 Timern meckert der Compiler.
Liest du eigentlich das was die "Zuhörer" dir schreiben, oder
willst du nur irgendwelche Codeschnipsel zeigen und herumjammern?
Zeige Sourcecode in der alle Zusammenhänge, Abhängigkeiten klar
sind. Wenn du hier nur weiter planlos herumlaberst besteht der
Verdacht auf Troll-Tätigkeit.