[solved] Hilfe bei Programmieraufgabe benötigt - Strukturen und Funktionspointer



  • Hi @ all!

    Ich versuche mich gerade an einer Programmieraufgabe für meinen Kurs komme aber nicht ganz dahinter was da verlangt ist.. Auch bin ich nicht soo dicke mit Strukturen und Funktionspointern und wälze schon seit geraumer Zeit Tutorials dazu..
    Die Aufgabe besteht darin einen "Stack" zu schreiben welcher mit Strukturen arbeitet.

    Zur Übersicht:
    Eine erste Struktur "Stack_Elem" erzeugt die eigentliche Liste (Inhalt ist ein struct Stack_Elem *pointer und ein void *data). Dazu gehören auch 3 Funktionen zum erstellen, löschen und printen.

    Eine zweite Struktur soll als Verwaltungseinheit dienen mit einem Pointer auf das erste Element und 3 Funktionspointer. DIese Pointer sollen auf die vorher erwähnten Funktionen zeigen. Soweit so gut.. Was mir nun nicht in den Kopf geht sind die bereits mitgelieferten Prototypen. Aber das zeig ich euch am besten erstmal:

    http://s7.directupload.net/images/131029/4gvrk8ai.jpg

    Der Prototyp des Funktionspointers um den es mir geht sieht folgendermaßen aus
    (zusätzlich mit der Stack-Struktur die ich erstellt habe):

    struct Stack
    {
        struct Stack_Elem *first;
        int size;
        void *(*data_new)(void *data);
        void (*data_delete)(void *data);
        void (*data_print)(void *data);
    };
    
    // neuen Stack erzeugen
    struct Stack * Stack_new(void * (*data_new) (void *data), void (*data_delete) (void *data), void (*data_print) (void *data));
    

    Und die Funktionen zu "Stack_Elem" sehen so aus:

    struct Stack_Elem *Stack_Elem_new(struct Stack_Elem *p, void *d);
    void *Stack_Elem_delete(struct Stack_Elem *p);
    void Stack_Elem_print(struct Stack_Elem *p);
    

    Nun zu meinem Problem:

    Ich verstehe nicht ganz worauf das hinausführen soll! Soweit ich das verstehe muss der Funktionspointer vom allgemeinen Aufbau so sein wie die Funktion dessen Adresse er aufnehmen soll, korrekt? Laut dem Bild in dem Link soll nun z.B. data_new der Pointer zu Stack_Elem_new sein.
    Aber die Funktionspointer sehen von den Datantypen her und der Anzahl der zu übergebenden Argumente anders aus.

    Das mit dem void-Pointer als Rückgabetyp könnte ich gerade noch verstehen (das sollte dann doch mit casten hinhauen bzw. der Rückgabetyp der Funktion kann trotzdem aufgenommen werden, aber die Argumente?

    Und wie kann ich mit dem vorgegebenen Prototypen für den neuen Stack die bereits vorbereiteten Pointer in der Stack-Struktur richtig initialisieren?
    meines Wissens sollte ich doch dem Pointer dann nur die Adresse der FUnktion geben, oder? Also ala:

    void myFkt(int alpha, double beta){}
    void (*p_myFkt)(int, double);
    p_myFkt = &myFkt;
    

    Ich hoffe ihr könnt verstehen was ich meine und habt dazu ein paar Ideen!

    mfg,



  • Abayo schrieb:

    ... Programmieraufgabe für meinen Kurs ...
    ... http://s7.directupload.net/images/131029/4gvrk8ai.jpg
    ... Ich hoffe ihr könnt verstehen was ich meine und habt dazu ein paar Ideen!

    Wer soll denn hier was lernen - Du oder wir? 😕
    Studierst Du etwa Informatik?



  • Abayo schrieb:

    Ich verstehe nicht ganz worauf das hinausführen soll!

    Ich benutze derartige Konstrukte, um die objektorientierte Programmierung überzuleiten (http://www.proggen.org/doku.php?id=cpp:oop:funcptr)

    Abayo schrieb:

    Soweit ich das verstehe muss der Funktionspointer vom allgemeinen Aufbau so sein wie die Funktion dessen Adresse er aufnehmen soll, korrekt?

    Korrekt.

    Abayo schrieb:

    Laut dem Bild in dem Link soll nun z.B. data_new der Pointer zu Stack_Elem_new sein.
    Aber die Funktionspointer sehen von den Datantypen her und der Anzahl der zu übergebenden Argumente anders aus.

    Dann wirst Du eins von beiden anpassen müssen.

    Abayo schrieb:

    Das mit dem void-Pointer als Rückgabetyp könnte ich gerade noch verstehen (das sollte dann doch mit casten hinhauen bzw. der Rückgabetyp der Funktion kann trotzdem aufgenommen werden, aber die Argumente?

    Ich gehe davon aus, dass "Stack_Elem_new" einem Konstruktor entsprechen soll. Ich kenne die Aufgabenstellung aber nicht direkt.

    Ein Konstruktor bekommt eine Adresse geliefert, den "this"-Pointer und muss diesen Speicherbereich so einrichten, dass er ein gültiges Objekt darstellt.

    Wenn Du also ein StackElement hast, was ein Auto darstellen soll, so darf die Variable Farbe nicht mehr willkürlich sein und der char const * Hersteller muss auf einen validen Herstellernamen zeigen. Sonst wäre das Objekt ungültig.

    Abayo schrieb:

    Und wie kann ich mit dem vorgegebenen Prototypen für den neuen Stack die bereits vorbereiteten Pointer in der Stack-Struktur richtig initialisieren?

    Auch Dein Stack braucht einen Konstruktor. Das ist Deine Funktion Stack_New. Sie legt einen Stack an und sorgt dafür, dass die Funktionspointer gültig belegt sind und first so initialisiert ist, dass es noch kein gültiges erstes Element gibt: NULL.

    berniebutt schrieb:

    Wer soll denn hier was lernen - Du oder wir? 😕

    Ich suche noch nach einer Möglichkeit, in wie fern Dein Beitrag Dir oder dem Fragesteller weiterhelfen könnte. Wenn es keine gibt, wäre er nicht nur nicht hilfreich, sondern vollkommen überflüssig.



  • Super, danke Xin!

    Deine Antwort hat mir gute weitergeholfen und das Program läuft zumindestens jetzt und macht was es soll (soweit ich das erkennen kann 😃 )

    Ob es so ist wie gewollt weiß ich nicht, da ich 2 zusätzliche globale Pointer auf die Struktur verwende.. (die vorgegebenen Funktion-Prototypen und die beschreibung dazu hatten alle keinen Pointer..)
    Aber das sehe ich dann 🤡

    Also nochmals vielen Dank!



  • Abayo schrieb:

    Super, danke Xin!

    Deine Antwort hat mir gute weitergeholfen und das Program läuft zumindestens jetzt und macht was es soll (soweit ich das erkennen kann 😃 )

    Schonmal ein Fortschritt.

    Abayo schrieb:

    Ob es so ist wie gewollt weiß ich nicht, da ich 2 zusätzliche globale Pointer auf die Struktur verwende.. (die vorgegebenen Funktion-Prototypen und die beschreibung dazu hatten alle keinen Pointer..)
    Aber das sehe ich dann 🤡

    Globale Pointer sind in der Regel ein Zeichen dafür, dass was nicht optimal gelöst wurde... ^^

    Wofür sind die Pointer denn überhaupt gut!?


Anmelden zum Antworten