Quantcast
Channel: Multimediaforum
Viewing all articles
Browse latest Browse all 4603

Funktionsaufruf über Adresse

$
0
0
Hallo an Alle,

ich habe folgendes Programm. Es soll eine einfache Webradio-Oberfläche auf der Konsole sein. WEnn alles klappt, soll es auf Raspberry Pi laufen.

Mein Problem: ich möchte, wenn ich die Entertaste drücke, eine Funktion ausführen. Wenn ich den ersten Menüeintrag wähle und Ender drücke klappt es auch, der Zeiger stack_ptr->next steht ja auch richtig. Bei allen anderen Einträgen klappt es nicht.
Der Aufruf sieht wie folgt aus:
Code:

stack_ptr->next->funcAddr();
Wie muß der Aufruf aussehen, wenn ich auf das n-te Element zugreifen will?

Danke für Eure Tipps und Hinweise.
Bis dann ...
MfG
Günter


Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <time.h>
#include <locale.h>
#include <ncurses.h>


/*
 * Globale Definitionen
 */

/*
 * Konstante
 */
#define BUFFER_SIZE        255

/*
 * Strukturen
 */
typedef struct s_menue {
        char menuetext[100];                // Menütext
        int art;                                        // Art der folgenden Adresse        0 = letzte Stufe
                                                                //                                                                1 = weiteres Menü
        int max;                                        // maximale Anzahl Menüelemente
        void (* funcAddr)();                // Adresse einer Funktion
        struct s_menue *array;        // Adresse eines Arrays
        struct s_menue *next;        // Nachfolger
        struct s_menue *prev;        // Vorgänger

} s_menue;


/*
 * Zeiger
 */
s_menue *stack_ptr;
s_menue *stack_help;

/*
 * Arrays
 */
s_menue hauptmenue[10];
s_menue radio[10];
s_menue genre[10];

/*
 * Funktionen
 */

void statuszeile(int k, char *t[], int a);
void menue_anzeigen(s_menue *menue);
int stackinit(void);
int push(s_menue *menue);

void programm_beenden(void);
void fuellen_menues(void);
void letzter_sender(void);

/*
 * Variable
 */
int b;

/***********************************************************************************
 * Hauptprogramm
 ***********************************************************************************/

int main()
{
        /*
        * Variable
        */
        int j;
        int i;
        int c;
        int m_hm;
        int m_rm;

        /*
        * Arrays
        */

        /*
        * Programmteil
        */

        /*
        * Füllen der Menüs
        */
        fuellen_menues();


        /*
        * Programm initialisieren
        */

        /*
        * curses initialisieren
        */
        initscr();  /*curses initialisieren*/
        keypad(stdscr,TRUE);

        /*
        * Stack initialisieren
        */
        if (stackinit() == 1){
                mvprintw(12, 2, "%s\n","Stack  initialisiert");

                /*
                * Hauptmenue auf Stack legen
                */
                if(push(hauptmenue) == 1){
                        /*
                        * Hauptmenue ausgeben
                        */
                        menue_anzeigen(stack_ptr->next);
                        mvprintw(12, 2, "%s\n","Hauptmenü auf Stack gelegt");

                        // Cursor auf erste Zeile setzen
                        i = 1;
                        move(i,2);

                        b = 1;
                }
                else
                        b = 0;



                while(b == 1)
                {
                        c=getch();
                        switch(c)
                        {
                                case KEY_DOWN:i++;
                                        if (i == stack_ptr->next->max + 1){
                                                i = 1;
                                }
                                move(i,2);
                                break;

                                case KEY_UP:i--;
                                        if (i == 0){
                                                i = stack_ptr->next->max;
                                }
                                move(i,2);
                                break;

        //                        case KEY_LEFT: strcpy(cmd,"mpc volume -5 > erg12.xxx ");
        //                                system(cmd);
        //                        break;

                                //                        case KEY_ENTER: mvaddstr(i, 2, "Taste Enter");
                                case 10:
                                        stack_ptr->next->funcAddr(); // <===== Problem

                                break;

        //                        move(i,2);

        //                        case KEY_RIGHT: strcpy(cmd,"mpc volume +5 > erg12.xxx ");
        //                                        system(cmd);
                        }
                }
        }

        endwin();


}

/**********************************************************************************************
* Funktionen
***********************************************************************************************/

/*
 * statuszeile
 */

void statuszeile(int k, char *t[], int m) {
        move (8,2);
        deleteln();
        mvprintw(8, 2, "%s\n",t[k]);
        move(k,2);
}


/*
 * menue_anzeigen
 */
void menue_anzeigen(s_menue *menue){
        int j;
        int m;

        m = menue[0].max;
        for (j=0;j<m;j++) {
                mvprintw(j+1, 2, "%s\n",menue[j].menuetext);
        }
        mvprintw(12, 2, "%s\n","Menü angezeigt");
}

/*
 * stackinit
 */
int stackinit(void){
        if((stack_ptr=malloc(sizeof(struct s_menue))) != NULL){
                stack_ptr->next = NULL;
                strcpy(stack_ptr->menuetext,"dummy");
                stack_ptr->array = NULL;
                stack_ptr->funcAddr = NULL;
                stack_ptr->art = -1;
                stack_ptr->prev = NULL;
                return 1;
        }
        else
                return 0;
}

/*
 * push()
 */
int push(s_menue *menue){
        menue->next = stack_ptr->next;
        stack_ptr->next = menue;
        return 1;
}

/*
 * programm_beenden
 */
void programm_beenden(void){
        b =0;
}

/*
 * fuellen_menues
 */
void fuellen_menues(void){
        /*
        * Füllen Hauptmenü
        */

        strcpy(hauptmenue[0].menuetext,"Letzten Sender abspielen");
        hauptmenue[0].art = 0;
        hauptmenue[0].funcAddr = letzter_sender;

        strcpy(hauptmenue[1].menuetext,"Radiosender");
        hauptmenue[1].art = 1;
        hauptmenue[1].funcAddr = NULL;

        strcpy(hauptmenue[2].menuetext,"Spartensender");
        hauptmenue[2].art = 1;
        hauptmenue[2].funcAddr = NULL;

        strcpy(hauptmenue[3].menuetext,"Einstellungen");
        hauptmenue[3].art = 1;
        hauptmenue[3].funcAddr = NULL;

        strcpy(hauptmenue[4].menuetext,"Beenden");
        hauptmenue[4].art = 0;
        hauptmenue[4].funcAddr = programm_beenden;

        hauptmenue[0].max = 5;


        /*
        * Füllen Radiomenü
        */
        strcpy(radio[0].menuetext,"WDR");
        radio[0].art = 0;
        radio[0].funcAddr = NULL;

        strcpy(radio[1].menuetext,"NDR");
        radio[1].art = 0;
        radio[1].funcAddr = NULL;

        strcpy(radio[2].menuetext,"SWR");
        radio[2].art = 0;
        radio[2].funcAddr = NULL;

        strcpy(radio[3].menuetext,"zurück");
        radio[3].art = 0;
        radio[3].funcAddr = NULL;

        radio[0].max = 4;

}

/*
 * letzter_sender
 */
void letzter_sender(void){
        mvprintw(12, 2, "%s\n","function ----> letzter_sender <----");
}


Viewing all articles
Browse latest Browse all 4603