switch



  • hi

    wieso kann ich bei einer switch-anweisung keine variable vom type string benutzen? das ganze schaut so aus:

    void Userinput(String input)
    {
    	switch(input)
        {
        	case "hi":
            //.............
            break;
    
        	case "hello":
            //.............
            break;
    
        	case "brb":
            //.............
            break;
        }
    }
    

    ich möchte also mittels switch-anweisung schauen was in input (vom type string) drin ist, und somit zur passenden stelle gehen.



  • sorry, korrektur:
    das ganze ist vom type char.

    char input[128];
    
    void Userinput() 
    { 
        switch(input) 
        { 
            case 'hi': 
            //............. 
            break; 
    
            case 'hello': 
            //............. 
            break; 
    
            case 'brb': 
            //............. 
            break; 
        } 
    }
    

    was muss ich tun das es so klappt? und eben der ganze array inhalt. z.B.

    case 'das ist das was ich meine':
    //....
    break;



  • Du musst die "Text"-Klammern verwenden, wenn es um eine Zeichenkette geht. Bei char verwendet man ein Feld dafür, C++-String wäre natürlich angebrachter.



  • versteh dich nicht. also folgendes:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	String input = "das ist ein test";
        switch(input)
        {
        	case "guten tag der herr":
    		//code....
            break;
    
            case "das ist ein test":
            //code....
            break;
    
            case "laber":
            //code....
            break;
        }
    }
    

    ergibt folgende fehler:

    [C++ Fehler] Unit1.cpp(21): E2383 Der Auswahlausdruck in den Klammern einer switch-Anweisung muß ganzzahlig sein.
    [C++ Fehler] Unit1.cpp(23): E2313 Konstantenausdruck erforderlich
    [C++ Fehler] Unit1.cpp(27): E2313 Konstantenausdruck erforderlich
    [C++ Fehler] Unit1.cpp(27): E2172 Doppelte case-Marke
    [C++ Fehler] Unit1.cpp(31): E2313 Konstantenausdruck erforderlich
    [C++ Fehler] Unit1.cpp(31): E2172 Doppelte case-Marke

    der erste fehler ist schon klar. es muss vom type int sein. aber ich muss es hald als String haben. was genau muss ich jetzt tun um die fehler zu beseitigen bzw. das es geht?



  • Wenn ich mich richtig erinnere ging das nicht so einfach mit switch und
    strings bzw. std::strings. Eine Möglichkeit wäre es mit hash werten zu arbeiten.

    Devil





  • C Newbie schrieb:

    std::map<std::string, Funktionszeiger>

    Ich gebe zu, dass in diesem Fall um ein Entwurfsmuster geht, das zwar Strategie genannt wurde.



  • Mit dem Strategiemuster hat das nichts zu tun.



  • Bashar schrieb:

    Mit dem Strategiemuster hat das nichts zu tun.

    Doch.
    Der "funktionzeiger", der eine Art des Funktors ist, ist nämlich eine Strategie.
    Die Schleife, die eigentlich die Alternative zu all diesen "switch" Anweisungen ist, die durch alle Eintraege der Map iteriert, ist ein Kontext.



  • Hallo,
    also imo ist das eine simple Look-up-Table. Strategy sehe ich hier beim besten Willen nicht. Wo ist z.B. der abstrakte/allgemeine Algorithmus, der in Strategy-Klassen implementiert wird?

    Ich sehe hier nur die Zuordnung zwischen einem Schlüssel und einer Funktion. Zwischen den Funktionen gibt es aber keinerlei Beziehungen.



  • Soweit ich weis kann man nur build-in types mit einem switch benutzen. Die einfachste Alternative ist meiner Ansicht nach:

    string a="A";
    if(a=="A"){}
    else if(a=="B"){}
    else if(a=="C"){}
    


  • void __fastcall TForm1::Button1Click(TObject *Sender) 
    { 
        String input = "das ist ein test"; 
        switch(input) 
        { 
            case String("guten tag der herr"): 
            //code.... 
            break; 
    
            case String("das ist ein test"): 
            //code.... 
            break; 
    
            case String("laber"): 
            //code.... 
            break; 
        } 
    }
    


  • Das war wohl nix.



  • HumeSikkins schrieb:

    Hallo,
    also imo ist das eine simple Look-up-Table. Strategy sehe ich hier beim besten Willen nicht. Wo ist z.B. der abstrakte/allgemeine Algorithmus, der in Strategy-Klassen implementiert wird?

    class Strategie{
    public:
        virtual void operator() = 0;
    };
    class KonkreteStrategie : public Strategie{
        virtual void operator(){
        //konkreter Algorithmus
        }
    };
    //das ist ein Kontext
    map<std::string, Strategie*> strategies;
    //eine konkrete Strategie wird ausgewaehlt und irgendwie verwendet.
    map<std::string, Strategie*>::iterator i = strategies.find(...); 
    if (i != strategies.end()) (i->second)();
    


  • Exodomog schrieb:

    hi

    wieso kann ich bei einer switch-anweisung keine variable vom type string benutzen? das ganze schaut so aus:

    ich möchte also mittels switch-anweisung schauen was in input (vom type string) drin ist, und somit zur passenden stelle gehen.

    Du kannst in switch(Ausdruck) nur vollgendes benutzen:

    Ausdruck muss ein Ganzzahliger Typ sein, also: int, bool, char...wobei char nur 1 Zeichen bedeutet und keine Zeichenkette.

    Du kannst aber für den Ausdruck eine Funktion benutzen, die einen Ganzzahligen Wert zurückgibt. Soll heißen, werte deinen eingegebenen String aus mit der Funktion und gebe vorher definierte Werte mit der Funktion zurück, je nach dem welcher String eingegeben wurde.



  • Der Kontext ist im Strategie-Muster eine Klasse, die einen Verweis auf die Strategie beinhaltet. Bestimmte Anfragen an die Kontext-Klasse werden an die Strategie delegiert, und durch unterschiedliche konkrete Strategieklassen wird unterschiedliches Verhalten bewirkt.
    Indem du das Muster auf simple Polymorphie reduzierst, nimmst du ihm den ganzen Kontext ... die Motivation, die Intention. Würde man das generell machen, würde der Design-Pattern-Katalog ziemlich zusammenschrumpfen, z.B. können State und Command, vielleicht auch Bridge, ebenfalls auf Anwendung von Polymorphie reduziert werden (State hat sogar das gleiche UML-Diagramm wie Strategy).



  • Bashar schrieb:

    Der Kontext ist im Strategie-Muster eine Klasse, die einen Verweis auf die Strategie beinhaltet. Bestimmte Anfragen an die Kontext-Klasse werden an die Strategie delegiert, und durch unterschiedliche konkrete Strategieklassen wird unterschiedliches Verhalten bewirkt.

    Na und? Hier sehe Ich kein Problem.

    Bashar schrieb:

    Indem du das Muster auf simple Polymorphie reduzierst, nimmst du ihm den ganzen Kontext ... die Motivation, die Intention. Würde man das generell machen, würde der Design-Pattern-Katalog ziemlich zusammenschrumpfen, z.B. können State und Command, vielleicht auch Bridge, ebenfalls auf Anwendung von Polymorphie reduziert werden (State hat sogar das gleiche UML-Diagramm wie Strategy).

    Ok.Ich habe mir kurz nachgedacht, dass Ich mich etwas klobig ausgedruekt habe.
    Mangels konreter Verweisung auf ein Problem war es allzu voreillig über dieses Muster zu sprechen. Was Ich sagen wollte, ist, dass man diese "switch" Anweisungen sehr einfach mittles des Strategiemusters loswerden kann. Aber wenn man darüber spricht, das er mit dieser Anweisungen ein Problem hat, geht es eher um das Strategiemuster als um pure Polymorphie.



  • desert pinguin schrieb:

    Na und? Hier sehe Ich kein Problem.

    Das Problem ist, dass diese Beschreibung sich nicht mit dem vorliegenden Sachverhalt deckt.

    Bashar schrieb:

    Was Ich sagen wollte, ist, dass man diese "switch" Anweisungen sehr einfach mittles des Strategiemusters loswerden kann.

    Wie? Mit deinem geposteten Code nicht, das ist, wie gesagt, keine Anwendung des Strategiemusters. Eine Art von Command vielleicht.



  • Bashar schrieb:

    desert pinguin schrieb:

    Na und? Hier sehe Ich kein Problem.

    Das Problem ist, dass diese Beschreibung sich nicht mit dem vorliegenden Sachverhalt deckt.

    Bashar schrieb:

    Was Ich sagen wollte, ist, dass man diese "switch" Anweisungen sehr einfach mittles des Strategiemusters loswerden kann.

    Wie? Mit deinem geposteten Code nicht, das ist, wie gesagt, keine Anwendung des Strategiemusters. Eine Art von Command vielleicht.

    Doch.
    Angenohmen, wir haben folgender Code:

    switch(...){
    case :
    //etwas
    break;
    case :
    //etwas anderes
    break;
    case:
    //noch etwas anderes
    break;
    }
    

    All diese "etwas" können als verschiedene Strategie betrachten werden.
    Das Strategiemuster besagt, dass diese monolitische, konditionale Konstruktionen möglichst durch eine Strategiehierarchie und dynamische Bindung ersetzt werden sollen.Das betrifft auch "if-else" Konstruktionen.



  • desert pinguin schrieb:

    Das Strategiemuster besagt, dass diese monolitische, konditionale Konstruktionen möglichst durch eine Strategiehierarchie und dynamische Bindung ersetzt werden sollen.Das betrifft auch "if-else" Konstruktionen.

    Das ist ein Nebeneffekt des Strategiemusters, aber nicht der Kern der Sache.



  • Bashar schrieb:

    desert pinguin schrieb:

    Das Strategiemuster besagt, dass diese monolitische, konditionale Konstruktionen möglichst durch eine Strategiehierarchie und dynamische Bindung ersetzt werden sollen.Das betrifft auch "if-else" Konstruktionen.

    Das ist ein Nebeneffekt des Strategiemusters, aber nicht der Kern der Sache.

    Stimmt.Ich habe nichts einzuwenden.Vielleicht fehlten mir einige richtigen Wörter.

    desert pinguin schrieb:

    Mangels konreter Verweisung auf ein Problem war es allzu voreillig über dieses Muster zu sprechen. Was Ich sagen wollte, ist, dass man diese "switch" Anweisungen sehr einfach mittles des Strategiemusters loswerden kann.

    Das habe Ich frueher gesagt.


Anmelden zum Antworten