Array von Zeigern auf Funktionen mit int Array vergleichen



  • Hallo,

    habe mir nun die Aufgabe gemacht ein Quiz zu erstellen - Es gibt einen Frage/Antworten Pool und daraus soll sich das Programm 10 zufällig gewählte Fragen ziehen.

    Jetzt habe ich mir überlegt, ein Array mit Zufallszahlen zu füllen und eins mit Zeigern die auf die Funktionen mit Fragen hindeuten. Leider kommt immer wieder der Fehler, dass er einen Pointer und einen Integer nicht vergleichen will.

    Hier mal der Quellcode:

    #include <iostream>
    #include <time.h>
    #include <stdlib.h>
    #include "MyLittlePonyQuiz_Leicht.hpp"
    
    using namespace std;
    typedef int (*pFunc)();
    
    MyLittlePonyQuiz_Leicht MyLittlePonyQuiz_Leicht_Objekt;
    int Antwort;
    
    int MyLittlePonyQuiz_Leicht_Frag1_main();
    int MyLittlePonyQuiz_Leicht_Frag2_main();
    int MyLittlePonyQuiz_Leicht_Frag3_main();
    int MyLittlePonyQuiz_Leicht_Frag4_main();
    
    int main()
    {
        cout << "****************" << endl;
        cout << "MyLittePonyQuiz" << endl;
        cout << "****************" << endl;
        cout << endl<<endl;
    
        srand (time(NULL));
        int Array_Zufallszahl[6];
        int Auswahl;
    
        cout << "Bitte wählen Sie Ihre Schwierigkeitsstufe: ";
                "(1) Leicht";
        cin >> Auswahl;
    
    /*    switch (Auswahl)
        {
            case 1: MyLittlePonyQuiz_Leicht_Frag1_main(); break;
            default: cout << "Dies ist keine gültige Nummer!" <<endl;
        }
    */
    
        pFunc ZeigerArray[4];
        ZeigerArray[0] = &MyLittlePonyQuiz_Leicht_Frag1_main;
        ZeigerArray[1] = &MyLittlePonyQuiz_Leicht_Frag2_main;
        ZeigerArray[2] = &MyLittlePonyQuiz_Leicht_Frag3_main;
        ZeigerArray[3] = &MyLittlePonyQuiz_Leicht_Frag4_main;
    
        for (int i = 0; i < 4; i++)
        {
           if (Array_Zufallszahl[i] == ZeigerArray[i])  //Hier liegt der Fehler! warum will er die nicht überprüfen ? 
                cout << ZeigerArray[i];
        }
    
        return 0;
    }
    

    Bitte richtet nicht so hart darüber, bin noch Anfänger.

    Gruß


  • Mod

    Was soll denn der Vergleich deiner Zufallszahlen (die übrigens noch nirgendwo gezogen werden) mit den Zeigern bringen? Du willst doch wohl eher die Funktion aufrufen, auf die der Zeiger an der Position der gezogenen Zufallszahl zeigt. Also (wenn ich mal das Zufallszahlenarray weglasse, dieses darfst du später selber füllen) etwas wie:

    ZeigerArray[rand() % 4] ();  // Ruft eine zufällige Funktion aus deinem Array auf
    


  • habe mir nun die Aufgabe gemacht ein Quiz zu erstellen - Es gibt einen Frage/Antworten Pool und daraus soll sich das Programm 10 zufällig gewählte Fragen ziehen.

    Soweit so gut.

    Jetzt habe ich mir überlegt, ein Array mit Zufallszahlen zu füllen und eins mit Zeigern die auf die Funktionen mit Fragen hindeuten. Leider kommt immer wieder der Fehler, dass er einen Pointer und einen Integer nicht vergleichen will.

    Die Idee ist schlicht und ergreifend bescheuert.

    Nehmen wir die Ausgangsstellung: Du möchtest Zehn zufällige Fragen aus einem möglichen Set ziehen.
    Wieso dann nicht erstmal Frage-Klassen erstellen:

    struct Question
    {
        Question(std::string const& q) : question(q) {}
    
        std::string const question;
        // Hier können noch mehr Attribute hin, wie Schwierigkeitsgrad usw.
    
        virtual ~Question() = 0;
    
        // Es ließe sich noch eine virtuelle Funktion readAndCompare schreiben, die die Antwort aus der Standardeingabe liest und auswertet. 
    };
    
    inline bool operator==(Question const& lhs, 
                           Question const& rhs)
    {
        return lhs.question == rhs.question;
    }
    
    /// Hier kann noch der Größer-Gleich Operator implementiert werden, mit std::lexicographical_compare
    
    struct QuestionStringAnswer : public Question
    {
        virtual ~QuestionStringAnswer(){}
    
        QuestionStringAnswer(std::string const& question, 
                             std::string const& answer) : 
            Question(question),
            answer(answer) {}
    
        std::string answer;
    };
    

    Und dann

    boost::pointer_vector<Question> questions; // oder std::vector<unique_ptr> o. ä.
    
    // Fragen hinzufügen
    questions.push_back( new QuestionStringAnswer("Weißt du, was noch lustiger ist als 24?", "25") ); // Für diesen Fall ließe sich bereits QuestionIntAnswer implementieren.
    // ...
    
    std::random_shuffle( questions.begin(), questions.end() ); /// Hier passiert das wichtigste: Der Vector wird gemischt. Anschließend lassen sich nacheinander 
                                                               /// die zufälligen Fragen stellen.
    

    (Alles ungetestet!)


  • Mod

    Sone, dein Vorschlag ist schlicht und ergreifend bescheuert.



  • SeppJ schrieb:

    Sone, dein Vorschlag ist schlicht und ergreifend bescheuert.

    +1



  • DarkChip, der Ansatz ist nicht schlecht, allerdings macht der Vergleich mit den Zeigern wenig Sinn. Wozu so viele Funktionen? Wozu rohe Arrays? Ich stelle mir die Implementierung im Groben so vor:
    - erstelle eine Liste mit Fragen und antworten (z.B. std::vector< std::vector <std::string> > )
    - wähle zufällig eine Frage aus ( operator[] ermöglicht den Zugriff auf Fragen und Antworten über den Index)
    - lese die Eingabe ein und vergleiche mit der richtigen Antwort
    Und das alles ohne 100 Funktionen. Sicherlich wird es noch elegantere Lösungen geben.


Anmelden zum Antworten