Forum: PC-Programmierung Fehlermeldung bei '.case WM_TIMER:'


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von C-Zwerg (Gast)


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

von Oliver S. (oliverso)


Lesenswert?

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

von Horst V. (hoschti)


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

von klammern (Gast)


Lesenswert?

C-Zwerg schrieb:
> if (RS232connect_fault == TRUE)
> 22      {
> 23       Serial_Init;
> 24      }

das muss bestimmt auch eine Funktion sein.

von C-Zwerg (Gast)


Lesenswert?

Die Grundstrucktur habe ich aus der MS-Seite
Link:https://docs.microsoft.com/en-us/windows/win32/winmsg/using-timers

Was erzeugt SetTimer?
Und warum ist das nun nicht mit Case verarbeitbar?

von Thomas Z. (usbman)


Lesenswert?

In der Überschrift steht case WM_TIMER:
weiter unten im source steht: case Timer2:

WM_TIMER ist eine Windows Konstante Timer2 irgend was anderes

von PC-Freak (Gast)


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?

von PittyJ (Gast)


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.

von Rolf M. (rmagnus)


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.

von C-Zwerg (Gast)


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.

von Rolf M. (rmagnus)


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.

von Blindflieger (Gast)


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.

von PittyJ (Gast)


Lesenswert?

Dem beratungsresistenten TE kann man nur mitteilen:
- Programmieren ist nicht deine Sache
- das Bäckerhandwerk sucht noch Nachwuchs

von Dirk B. (dirkb2)


Lesenswert?

Verwende
1
#define IDT_TIMER_1 1001
2
#define IDT_TIMER_2 1002
Und ersetzte im Code die entsprechenden Variablen.

von Blindflieger (Gast)


Lesenswert?

PittyJ schrieb:
> - das Bäckerhandwerk sucht noch Nachwuchs

Aber auch dort ist Beratungsresistenz nicht gefragt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.