Eingabe als Funktion verwenden?



  • Hallo Leute!
    Ich stehe gerade vor einer Geistigen Knacknuss:
    Ich habe verschiedene Funktionen (funktion1, funktion2, ...)

    Wie kann ich nun mit einer simplen Eingabe einen Switch-Case ersetzen?

    Was ich meine ist:

    int eingabe;
    scanf("%d", &eingabe);
    
    funktion"%d"(); //"%d" kann man sich als die variable "eingabe" vorstellen
    
    return 0;
    

    Wie könnte ich also die Variable "eingabe" direkt an den funktionsnamen anhängen?

    Danke schon im Voraus! 😃
    The_Mighty_Muffin



  • Ok, habe es herausgefunden:

    int main()
    {
        char eing[2];
        char funktion[10] = "funktion";
            scanf("%c", &eing);
            strcat(funktion, eing);
    
        printf("%s", funktion);
        return 0;
    }
    

    Doch wie kann ich jetzt diese variable "funktion" weiterverwenden?

    Mein ziel ist, dass wenn der anwender am anfang "2" eingibt, diese dann in der Variable "funktion" als "funktion2" gespeichert wird.

    Diese Variable soll gleichzeitig als Name für die Funktion dienen:

    //anwender gibt 2 ein
    ("%s", funktion)(); //So sollte die Funktion etwa aufgerufen werden...
    

    In PHP gäbe es ja "echo":

    echo $funktion + "();"
    

    Wie ist das in C umsetzbar, dass am Schluss tatsächlich die funktion2 aufgerufen wird?



  • hi muffin
    pack funktionszeiger in ein array und dann rufste die funktionen übers array auf.



  • Danke Daydreamer!
    Habe ein bisschen im Netz nachgeschaut und habe meinen Code so angepasst:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef void (*VoidFnct) (void);
    
    void Funct1 (void)
    {
      //Funktion1
    }
    
    void Funct2 (void)
    {
      //Funktion2
    }
    
    void Funct3 (void)
    {
      //Funktion3
    }
    
    VoidFnct MyFunct[] = { Funct1, Funct2, Funct3 };
    
    int main()
    {
      int eing;
      scanf("%d", &eing);
      MyFunct[("%d", eing)]();
    
    }
    

    So funktioniert es auf jeden Fall wie ein Array 😃

    Danke für die Hilfe 👍


  • Mod

    Die Zeile 27 macht zufällig das was du denkst, aber nicht aus den Gründen die du denkst. Im Prinzip ist sie völliger Blödsinn, du hast nur Pech, dass sie trotzdem funktioniert und du den Fehler nicht bemerkst. Hier liegt irgendeine Art von magischem Denken vor, dass "%d" irgendwo außerhalb eines printf- oder scanf-Formatstrings irgendeine Bedeutung hätte. Außerdem totales Fehlverständnis wie Variablen funktionieren. Ich weiß nicht, wie du dazu kommst (Pfuschlehrbuch?), ich kann dir nur zeigen wie es richtig geht ( MyFunct[eing](); ) und versuchen zu erklären, warum deines trotzdem funktioniert (was du aber vemrutlich nicht verstehst):
    ("%d", eing) : Ist ein für sich geschlossener Ausdruck. Links steht ein Teilausdruck, ein char[3], rechts ein weiterer Ausdruck, ein int, dazwischen der Kommaoperator. Der Kommaoperator macht, dass diese Ausdêucke von links nach rechts ausgewertet werden und der Gesamtausdruck hat den Wert des rechtesten Ausdrucks. Das heißt, zuerst wird das Zeichenkettenliteral ausgewertet (d.h. es passiert nix), dann der integer (wieder passiert nix) und dann der Wert des Integers als Wert des Gesamtausdrucks angesehen. Insgesamt erhält man also den Wert von eing , man hätte und sollte daher auch gleich eing schreiben können (wie in der richtigen Lösung oben.)

    Du solltest dir dringend nochmal die Grundlagen von C ansehen, da scheinst du einiges falsch verstanden zu haben. Funktionszeiger sind schon ein bisschen gehobeneres Thema, da müssen die Grundlagen richtig sitzen.



  • Hallo SeppJ

    Was soll da heissen, ich verstehe es nicht? 😃
    Deine Erklärung klingt sehr logisch und erläuternd, ich habe auf jeden Fall alles verstanden was du geschrieben hast! (Ich verstehe Sachen ziemlich schnell, wenn man sie mir langsam erklärt... ^^)

    Ich habe mit C nicht sehr viel am Hut und bin mir von der Schule her mehr an das Objekt-Orientierte (Java) gewohnt. Da ich vorher noch viel mit PHP gearbeitet habe wurden meine C-Kentnisse immer schlechter!

    Jetzt repetiere ich das C nochmal, da ich nächste Woche einen Kurs über das Strukturierte Programmieren habe :p

    Da ist dieses Forum ja Ideal für zwischenfragen 😃



  • the_mighty_muffin schrieb:

    Was soll da heissen, ich verstehe es nicht?

    Du verstehst es nicht.

    the_mighty_muffin schrieb:

    ...ich habe auf jeden Fall alles verstanden...

    Sehr sehr unwahrscheinlich aufgrund deines o.g. Codes.

    Ein Array mit Funktionen benötigt man übrigens nicht unbedingt:

    void Funct1 (void)
    {
      //Funktion1
    }
    
    void Funct2 (void)
    {
      //Funktion2
    }
    
    void Funct3 (void)
    {
      //Funktion3
    }
    
    int main()
    {
      int eing;
      scanf("%d", &eing);
      (eing==1?Funct1:eing==2?Funct2:Funct3)();
      return 0;
    }
    

Anmelden zum Antworten