Fehlermeldung bei '.case WM_TIMER:'

Gast #6943783
Lesenswert?

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
   case WM_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
  case WM_COMMAND:
14
     switch(W_Parameter)
15
      {
16
         case WM_TIMER:
17
          switch (W_Parameter) 
18
            { 
19
            case Timer1:  -< 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
             return 0; 
30
 
31
      case Timer2:  -< Fehler
32
            // process the five-minute timer 
33

34
            return 0; 
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
#6943800
Lesenswert?

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
Gast #6943963
Lesenswert?

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?
Gast #6944014
Lesenswert?

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.
#6944026
Lesenswert?

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.
Gast #6944041
Lesenswert?

So triviale Sachen kenne ich ja.
An anderen Stellen funktioniert es auch mit dem case.
1
case WM_COMMAND:
2
     switch(W_Parameter)
3
      {
4
     case IDD_ParameterSetzen:
5
       AkkuParameter();
6
       return(0);
7

8
    case IDD_Info:
9
       Info2();
10
       return(0);
11

12
    case IDD_Darstellung:
13
       Zoomfaktor();
14
       return(0);
15

16
    case IDD_EINST_RS232:
17
       Schnittstelle();
18
       return(0);
19

20
    case IDD_EINST_Grenzwerte:
21
       Grenzwerte();
22
       return(0);
23

24
    // ******  Farben ******
25
    case ID_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
   case WM_PAINT:
2
        ....
3
        break;
4
         case WM_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.
#6944084
Lesenswert?

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.
Gast #6944093
Lesenswert?

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.

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