Switch case default



  • Hey Guys,
    meines Wissenstands nach wird die default Anweisung einer switch anweisung nur ausgeführt, wenn kein anderer Fall zutrifft. Ist das richig?
    Heute habe ich mal ein bischen mit der Win-API-Funktion Beep() gespielt, dazu habe ich folgenden Code geschrieben:

    void playTone(char tone)
    {
        switch (tone)
        {
          case 'c':
               Beep(264,100);
               break;
          case 'd':
               Beep(297,100);
               break;
          case 'e':
               Beep(330,100);
               break;
          case 'f':
               Beep(352,100);
               break;
          case 'g':
               Beep(396,100);
               break;
          case 'a':
               Beep(440,100);
               break;
          case 'h':
               Beep(495,100);
    
               break;
          case 'C':
               Beep(528,100);
               break;
          default:
                  Beep(264,100);
                  break;
        }
    }
    

    Diese Funktion funktioniert auch, doch wenn ich sie so aufrufe:

    playTone('c');
    

    (oder mit jedem anderen Ton)
    wird sowohl die entsprechende Case-Anweisung als auch der Default-Zweig ausgeführt -> ich bekomme also zwei Töne.
    Woran liegt dass?

    Falls es hilft, hier nochmal der komplette Code:

    #include <windows.h>
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    void playTone(char tone)
    {
        switch (tone)
        {
          case 'c':
               Beep(264,100);
               break;
          case 'd':
               Beep(297,100);
               break;
          case 'e':
               Beep(330,100);
               break;
          case 'f':
               Beep(352,100);
               break;
          case 'g':
               Beep(396,100);
               break;
          case 'a':
               Beep(440,100);
               break;
          case 'h':
               Beep(495,100);
    
               break;
          case 'C':
               Beep(528,100);
               break;
          //default:
            //      Beep(264,100);
              //    break;
        }
    }
    
    char getch()
    {
         char tmp = getchar();
         keybd_event(VK_RETURN,0,0,0);
         keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
         //Sleep(100);
         return tmp;
    }
    
    int main(int argc, char *argv[])
    {
        //Beep(495,1000);
        char tone = getchar();
        cout << tone;
        while (tone != 0)
        {
            playTone(tone);
            tone = getch();
        }
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Vielen Dank und frohe Weihnachten 😉



  • Das default bei 'c' nicht durchgeführt.
    Bei dir muss das andere Gründe haben.
    Vielleicht ist die Eingabe UTF-16 und es werden pro Zeichen zwei Funktionsaufrufe durchgeführt.
    Um das zu kontrollieren empfehle ich dir folgendes:

    void playTone(char tone)
    {
        std::cout << "playTone(" << (int) tone << ")\n";
        switch (tone)
        {
            ...
        }
    }
    

    C++-like würde man das Problem aber so lösen:

    map<char, int> tones;
    tones.add('c', 264);
    tones.add('d', 297);
    ...
    int freq = tones[tone];
    if (freq == 0) freq=tones['c'];
    Beep(freq, 100);
    


  • Normalerweße hast du recht, default müsste in deinem Code nur dann ansetzen, wenn sonst nichts ansetzt!

    Schreib mal:

    while (tone != 0)
        {
            playTone(tone);
            tone = getch();
    
            cout << '|' << tone << '|' << endl;
        }
    

    Und wenn du dann Beispielsweiße c eingibst und dann | c| ausgebenen wird, dann weißt du wo das Problem liegt!



  • Hey, dass ging ja schnell :).
    Daran, dass pro Eingabe zwei Zeichen eingelesen werden kann es glaube ich nicht liegen. Ich habe vergessen zu erwähnen, dass das Programm richtig arbeitet, wenn der Default-Zweig auskommentiert ist. Eure anderen Vorwchläge werde ich später ausprobieren. Vielen Dank.

    MfG



  • Frituese schrieb:

    Daran, dass pro Eingabe zwei Zeichen eingelesen werden kann es glaube ich nicht liegen.

    Doch. Du gibst doch auch 2 Zeichen ein oder ?
    ~Nämlich das Zeichen + Return.~



  • edited: vergessen - war quark 🙂



  • Jockelx schrieb:

    Frituese schrieb:

    Daran, dass pro Eingabe zwei Zeichen eingelesen werden kann es glaube ich nicht liegen.

    Doch. Du gibst doch auch 2 Zeichen ein oder ?
    ~Nämlich das Zeichen + Return.~

    Richtig!!

    Schreib mal

    playTone(tone[0]);
    

Anmelden zum Antworten