You are not logged in.

  • Login

Maik K.

Unregistered

1

Monday, April 18th 2011, 10:52pm

Menü mit Funktionspointern

Hallo!
Ich habe gerade versucht ein Menü mit Funktionspointern zu erstellen.
Nun bekomme ich aber vom LCC-Compiler eine Fehlermeldung bzgl. "acess violation". Denke das es an einem Pointer liegt, der ins Nirvana zeigt, allerdings wüsste ich nicht welcher das sein sollte!?
Hat von euch jemand eine Ahnung woran es liegen könnte?

Viele Grüße Maik

PS: Hier der Code:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
//Includes
#include <stdio.h>
 
//------------------Defines------------------
#define BOOL	char
#define FALSE   0
#define TRUE	(!FALSE)
 
//Number of menu entry
#define STATE_MAINMENU   		10
#define STATE_SUB1MENU   		20
#define STATE_SUB1SUB1MENU   	21
#define STATE_SUB2MENU   		30
 
//Key numbers
#define KEY_NULL				0
#define KEY_ENTER   			1
#define KEY_VORWAERTS			2
#define KEY_RUECKWAERTS			3
 
//------------------Vars------------------
unsigned char state;
 
//Text for the entries
char ITEM_MAINMENU[] = "Hauptmenue\n";
char ITEM_SUB1MENU[] = "1. Untermenue\n";
char ITEM_SUB1SUB1MENU[] = "1. Untermenue im Untermenue\n";
char ITEM_SUB2MENU[] = "2. Untermenue\n";
 
//---------Function prototypes------------
unsigned char StateMachine(char state, unsigned char stimuli);
char Submenu1(char input);
char Submenu2(char input);
char Sub1submenu1(char input);
 
typedef struct
{
	unsigned char state;
	unsigned char input;
	unsigned char nextstate;
} MENU_NEXTSTATE;
 
 
typedef struct
{
	unsigned char state;
	char *pText;
	char (*pFunc)(char input);
} MENU_STATE;
 
 
MENU_NEXTSTATE menu_nextstate[] = {
//  STATE      			  INPUT   		NEXT STATE
{STATE_MAINMENU, 		KEY_ENTER, 		STATE_SUB1MENU},
{STATE_SUB1MENU, 		KEY_ENTER, 		STATE_SUB1SUB1MENU},
{STATE_SUB1MENU, 		KEY_VORWAERTS, 	STATE_SUB2MENU},
{STATE_SUB1MENU, 		KEY_RUECKWAERTS, STATE_MAINMENU},
{STATE_SUB2MENU, 		KEY_RUECKWAERTS, STATE_SUB1MENU},
{STATE_SUB1SUB1MENU, 	KEY_RUECKWAERTS, STATE_SUB1MENU},
{0,                     	0,      		0},
};
 
 
MENU_STATE menu_state[] = {
//  STATE           	STATE TEXT              	STATE_FUNC
{STATE_MAINMENU,   	ITEM_MAINMENU,          	NULL},
{STATE_SUB1MENU,   	ITEM_SUB1MENU,          	Submenu1},
{STATE_SUB1SUB1MENU,   ITEM_SUB1SUB1MENU,      	Sub1submenu1},
{STATE_SUB2MENU,   	ITEM_SUB2MENU,          	Submenu2},
{0,                	NULL,                   	NULL},
};
 
 
void main(void)
 
{
 
	unsigned char nextstate;
	static char *statetext;
	char (*pStateFunc)(char);
	char input=0;
	char i;
 
// Initial state variables
	state = nextstate = STATE_MAINMENU;
	statetext = ITEM_MAINMENU;
	pStateFunc = NULL;
 
 
	for (;;)        	// Main loop
	{
 
        	// Plain menu text
        	if (statetext)
        	{
				printf(statetext);
 
            	statetext = NULL;
        	}
 
 
        	scanf( "%d", &input);
 
 
        	if (pStateFunc)
        	{
            	// When in this state, we must call the state function
           	nextstate = pStateFunc(input);
 
 
}
        	else if (input != KEY_NULL)
        	{
            	// Plain menu, clock the state machine
            	nextstate = StateMachine(state, input);
        	}
 
        	if (nextstate != state)
        	{
            	state = nextstate;
            	for (i=0; menu_state[i].state; i++)
            	{
                	if (menu_state[i].state == state)
                	{
                    	statetext =  menu_state[i].pText;
                    	pStateFunc = menu_state[i].pFunc;
                    	break;
                	}
 
            	}
        	}
    	}
 
 
 
}
 
 
unsigned char StateMachine(char state, unsigned char stimuli)
{
	unsigned char nextstate = state;	// Default stay in same state
	unsigned char i;
 
	for (i=0; menu_nextstate[i].state; i++)
	{
    	if (menu_nextstate[i].state == state && menu_nextstate[i].input == stimuli)
    	{
        	// This is the one!
        	nextstate = menu_nextstate[i].nextstate;
        	break;
    	}
	}
 
	return nextstate;
}
 
 
 
char Submenu1(char input){
 
	static char enter = 1;
 
	if(enter)
	{
    	enter = 0;
 
   printf("la le lu Untermenue 1");
	}
	else if (input == KEY_RUECKWAERTS)
	{
    	enter = 1;
    	return STATE_MAINMENU;
	}
 
	return STATE_SUB1MENU;
 
 
}
 
 
 char Submenu2(char input)
 {
 
	static char enter = 1;
 
	if(enter)
	{
    	enter = 0;
 
   printf("lu lu lu Untermenu 2");
	}
	else if (input == KEY_RUECKWAERTS)
	{
    	enter = 1;
    	return STATE_SUB1MENU;
	}
 
	return STATE_SUB2MENU;
 
 
	 }
 
 char Sub1submenu1(char input)
 {
 
 
	static char enter = 1;
 
	if(enter)
	{
    	enter = 0;
 
   printf("lala le: Unter Untermenu");
	}
	else if (input == KEY_RUECKWAERTS)
	{
    	enter = 1;
    	return STATE_SUB1MENU;
	}
 
	return STATE_SUB1SUB1MENU;
 
	 }

2

Tuesday, April 19th 2011, 6:52pm

Ein bisschen kaotisch dein Programm. Kommt der Fehler vom Compiler oder vom Debugger btw. vom erstellten Programm selbst? Ich vermute letzeres.

Hab mal dein Programm compiliert und getestet, es läuft, aber ich komme nur ins "la le lu Untermenue 1" rein der rest ist anscheinend nicht zugänglich. Kriege auch keinen Fehler.

Quoted


for (i=0; menu_nextstate.state; i++)

Weist du was die Schleife macht?
Sie wird einmal auf jedenfall ausgeführt und dann wird immer geschaut ob [i]menu_nextstate[i].state != NULL
ist, dies kann zu unerwarteten Fehlern führen.

Quoted


C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
if (pStateFunc)
{
	// When in this state, we must call the state function
	nextstate = pStateFunc(input);
}
else
if (input != KEY_NULL)
{
	// Plain menu, clock the state machine
	nextstate = StateMachine(state, input);
}


irgendetwas stimmt an dieser Stelle nicht, die Funktion StateMachine wird nur im Hauptmenu aufgerufen, und somit ist die Auswahl nur im Haputmenu möglich ....
Ich würd dir mal empfehlen deine Struktur zu überarbeiten und dem Benutzer eine Menuführungsbeschreibung geben bezüglich der Eingaben.

PS: Denk nicht so komplitziert bei der Struktur, einfach ist oft besser.

Mfg Rushh0ur

Maik K.

Unregistered

3

Tuesday, April 19th 2011, 9:06pm

Hi Rushh0ur!
Besten Dank für die Antwort.
Ja, der Fehler kam wohl vom Compiler!
Das der Code nicht das Gelbe vom Ei ist war mir klar.
War nur zum testen (Quick and dirty).
Habe das Programm ein wenig umgeschrieben (ja, auch die Forschleife :) habe ich ergänzt ), ein paar Datentypen verändert, usw.
Und nun läuft das ganze, zwar mit einem anderen Compiler, aber immerhin und Fehlerfrei!


Nochmals besten Dank für die Hilfe,

Viele Grüße Maik

Similar threads

Social bookmarks