Probleme mit Switch und Case (C)



  • Hallo ich versuche mich gerade an der Switch und case-Anweisung. Leider funktioniert die sache bei mir noch nicht so ganz wenn ich ein char wert einlese. Muss denn in c der Ausdruck nach dem switch immer vom typ int sein? Wollte bei diesem kleinen Beispiel eigentlich auf die Funkton getchar verzichten. da sowas immer plattformabhängig ist. Vielleicht ist auch nur ein fehler bei mir im code. Die Fehlermeldung sagt jedenfalls das der Ausdruck Case nicht vom typ int ist..schaut es euch einfach mal an

    bin für Hilfe dankbar
    TurboAnja

    #include<stdio.h>
    #include<stdlib.h>
    
    int main ()
    {
    
    char eingabe;
    int ausgabe;
    
    printf("\nDrücken Sie y für ja und N für No\n\n");
    scanf("%c",&eingabe);
    
    switch (eingabe)
          {
          case "y":printf("Siehaben sich für Yes entschiede\n");
          case "n":printf("Sie brechen das Programm ab\n");
          }
    
    }
    

    



  • Hallo

    - verwende std::cout und std::cin anstelle von printf und scanf
    - swutch arbeitet sehr wohl mit char, du must eben auch Char-Konstanten verwende nund keine String-Konstanten

    switch (eingabe)
          {
          case 'y':...
          case 'n':...
          }
    

    - Da das nichts mit dem Builder zu tun hat verschieb ich dich.

    Bei einer einfachen Ja/Nein Entscheidung würde ich aber bei if-else bleiben.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • TurboAnja schrieb:

    Muss denn in c der Ausdruck nach dem switch immer vom typ int sein?
    

    Nein, aber ein integraler Typ, also im wesentlichen alle Formen von int, char und enum. Kein double, keine Klassen, keine Pointer.



  • warum eigentlich? Ich meine, die Einschränkung ist ja schon nicht klein und hat bestimmt nen guten grund...



  • piXelshooter schrieb:

    warum eigentlich? Ich meine, die Einschränkung ist ja schon nicht klein und hat bestimmt nen guten grund...

    Effizienz. 'switch'-Anweisungen in C werden (zumindest dort, wo das möglich ist, also bei eng zusammenliegenden Werten) als Sprungtabellen implementiert und das klappt eben nur, wenn es sich um ganzzahlige Werte handelt. Dieses Verhalten bedeutet eine konstante Ausführ-Laufzeit. Die ist natürlich nicht für alle Bereiche gegeben. Dass C++ dieselbe Beschränkung hat, wird wohl vor allem historische Gründe haben.

    In den .NET-Sprachen kann man z.B. auch String „switchen“. Um das effizient zu ermöglichen, werden hier für alle Fälle Hashtabellen-Einträge generiert.



  • Konrad Rudolph schrieb:

    Effizienz. 'switch'-Anweisungen in C werden (zumindest dort, wo das möglich ist, also bei eng zusammenliegenden Werten) als Sprungtabellen implementiert und das klappt eben nur, wenn es sich um ganzzahlige Werte handelt. Dieses Verhalten bedeutet eine konstante Ausführ-Laufzeit.

    richtig, das erklärt aber nicht, warum switch/case mit pointern nicht will.

    Konrad Rudolph schrieb:

    In den .NET-Sprachen kann man z.B. auch String „switchen“. Um das effizient zu ermöglichen, werden hier für alle Fälle Hashtabellen-Einträge generiert.

    bist du sicher? ich würde ja eher die adresse des strings nehmen. bei hashes ist keine eindeutigkeit gegeben. auch wenn sie 512-bit hashes oder sowas nehmen, kann's theoretisch trotzdem schief gehen.
    🙂


  • Mod

    Bashar schrieb:

    TurboAnja schrieb:

    Muss denn in c der Ausdruck nach dem switch immer vom typ int sein?
    

    Nein, aber ein integraler Typ, also im wesentlichen alle Formen von int, char und enum. Kein double, keine Klassen, keine Pointer.

    Genaugenommen integrale Typen oder Aufzählungstypen (die in C++ nicht integral sind) oder Klassen, die eine einzige Konvertierung in einen integralen oder Aufzählungstypen haben.



  • switch-freak schrieb:

    Konrad Rudolph schrieb:

    In den .NET-Sprachen kann man z.B. auch String „switchen“. Um das effizient zu ermöglichen, werden hier für alle Fälle Hashtabellen-Einträge generiert.

    bist du sicher? ich würde ja eher die adresse des strings nehmen. bei hashes ist keine eindeutigkeit gegeben. auch wenn sie 512-bit hashes oder sowas nehmen, kann's theoretisch trotzdem schief gehen.
    🙂

    Ich bin sicher. Und nein, Eindeutigkeit gibt es nicht, das ist aber nicht schlimm. Bei guten Hashes sind Kollisionen selten, darauf basieren Hashtabellen ja. Und nein, es wird natürlich *kein* 512-Bit-Hash genommen sondern ein normaler 32-Bit-Hash (sogar nur 31 Bit, weil das Framework dummerweise einen vorzeichenbehafteten Rückgabewert für die Object.GetHashCode-Funktion verwendet, was natürlich dumm ist), der dann noch auf die Tabellengröße runterskaliert wird.


Anmelden zum Antworten