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:
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
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();
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 <----");
}