Switch + Case

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Huhu, da ich immer wieder riiiiesige Abfragen sehe und mir denke, warum benutzt der / diejenige nicht anstatt if Switch? Daher dachte ich mir, mache ich ein Tut dazu wo das ganze erklärt wird, also legen wir direkt mal los. :thumbup:


    Sicherlich kennt jeder von euch die normalen if Abfragen

    new ValueXYZ = 5;
    if(ValueXYZ > 5)
    else if(ValueXYZ < 5)
    else if(ValueXYZ == 5)// usw...

    Wenn man das ganze dann mit riesigen Abfragehaufen zu tun hat, wirds schnell mal unübersichtlich. Daher gibts eine raffinierte Funktion die das ganze erheblich erleichtert und Code spart. (Dies sind einzeilige(!) Cases, mehrzeilige werden weiter unten erklärt)
    new ValueXYZ = 5;
    switch(ValueXYZ)
    {
    case 0: // Dieser Fall (engl. Case = Fall) würde aufgerufen werden wenn die Variable den Wert 0 hätte
    case 1: //Wert von 1 oder als if Abfrage if(ValueXYZ == 1)
    case 2: // Wert von 2 bzw if(ValueXYZ == 2)
    case 3: // Wert von 3 if(ValueXYZ == 3)
    //ich springe mal ein wenig vorwärts
    case 5: // Dieser Fall würde nun aufgerufen werden da unsere Variable genau 5 beträgt!
    } // SChließt Switch wieder

    Jedoch gibts noch weitaus mehr Möglichkeiten, denn anstatt
    if(ValueXYZ == 0 || ValueXYZ == 1) // Usw.
    geht es mit Switch noch wesentlich kürzer
    new ValueXYZ = 5;
    switch(ValueXYZ)
    {
    case 0,1,2,3,4:// Wenn ValueXYZ 1, 2, 3, 4 oder 0 wäre würde dieser Case aufgerufen werden
    case 5: // Jedoch wird nun dieser Code aufgerufen
    }


    Eine weitere Möglichkeit Switch zu verkürzen stellt Folgende dar
    new ValueXYZ = 5;
    switch(ValueXYZ)
    {
    case 0 .. 4://Dasselbe wie im Beispiel davor nur kürzer
    case 5:
    }


    Als letztes gibt es nur noch eine Sache zu erklären und zwar default: das im Grunde aufgerufen wird wie else

    if(IsPlayerAdmin(playerid))
    {
    }
    else // Dies entspräche default:
    {
    }
    new ValueXYZ = 5;
    switch(ValueXYZ)
    {
    case 0 .. 4: //also if(ValueXYZ >= 0 && ValueXYZ <= 4)
    case 5: // if(ValueXYZ == 5)
    default: // Dieser Code würde ausgeführt werden wenn ValueXYZ weder zwischen 0 und 5 liegt, also z.B. 13 wäre
    }

    Mehrzeilige Abfragen sähen wie folgt aus.
    new ValueXYZ = 5;
    switch(ValueXYZ)
    {
    case 0 .. 4:
    {
    print("Dieser Code wurde leider nicht ausgeführt.");
    print("Denn ValueXYZ ist > 4.");
    }
    case 5:
    {
    print("Dieser Code wird ausgeführt,");
    printf("denn ValueXYZ ist %d", ValueXYZ);
    }
    default:
    {
    print("Dieser Code wird ebenfalls nicht ausgeführt,");
    print("denn die Variable ist == 5 und nicht > 5");
    }
    }
    Im Grunde also wie ganz normale if-Abfragen, nur wie ich finde, einfacher. :thumbup:


    Hinweis:
    Man kann innerhalb des Case-Teils auch if-Abfragen benutzen!


    Anwendungsmöglichkeiten wären z.B. Callbacks wie OnPlayerSelectedMenuRow oder OnDialogResponse.


    Konstruktive Kritik ist erwünscht. 8o


    Lg ]hp[ :thumbup:


    /edit mehrzeilige Cases hinzugefügt.

    5 Mal editiert, zuletzt von ]hp[ ()

  • Habe ich ja auch nicht geschrieben :) Habe ein wenig bezüglich <, == und > hinzugefügt.
    Jedoch zur Erläuterung
    case 0,1,2,3,4: // wird nur Aufgerufen wenn die jeweilige Variable 0,1,2,3 oder 4 ist
    case 1 .. 4: // Dieser Fall würde aufgerufen werden wenn die Variable 1,2,3 oder 4 ist, das heißt hier fehlt die 0

  • case:1..4 Von 1 bis 4
    case:0,1,4,5 Nur die Zahlen 0,1,4,5
    Das meinte ich ;)
    Außerdem ist das dann doch sinnlos, wenn man > , < braucht nützt einem case doch nichts :D kann man also nur bedingt gebrauchen, bzw. nur für ganze zahlen
    Z.b im Dialog,die buttons, Menü Items usw...

  • Naja für eine if Abfrage würde ich auch kein Switch benutzen :D man muss halt den Nutzen auch abwägen :)

  • Michael das geht viel leichter ...



    switch(variable)
    {
    case 0: return SendClientMessage(playerid, FARBE, "Variable: 0");
    case 1: return SendClientMessage(playerid, FARBE, "Variable: 1");
    }


    edit: trotzdem sollte man darauf achten , dass man immer die beste Methode Zeit vor allem bei einem Tutorial weil sonst guckt das einer ab und macht es immer so

    Einmal editiert, zuletzt von zabus ()

  • Zabus, er redet von mehrzeiligen Abfragen. Und warum returnst du? Nach dem switch soll vllt. noch eine weitere Funktion durchgeführt werden die durch dein return abgeblockt wird. Von daher ist seins total richtig.

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25