Menü mit Funktionspointern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

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


    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.


    Quellcode

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


    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
  • 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