Menü für uController

Gast #2148953
Lesenswert?

Hallöchen,
wollte mir gerade zum Testen eine kleine Menüstruktur schreiben, die ich 
später dann auf einen uController hauen kann.
Das ganze wurde erst einmal als Konsolenanwendung geschrieben (siehe 
Anhang).
Bis jetzt dachte ich eigentlich, dass ich mit Funktionszeigern umgehen 
kann.

Es tritt eine "Runtime Ecxeption" beim Aufruf von:
1
.
2
.
3
 unsigned char nextstate;
4
 char (*pStateFunc)(char);
5
.
6
.
7
 if (pStateFunc)
8
            {
9
            
10
                nextstate = pStateFunc(input);
11

12

13
            }
14
.
15
.
16
.
auf.
Nun habe ich keine Ahnung ob es eventuell daran liegt, dass der 
LCC-Compiler etwas dagegen hat.., oder der Fehler nur auftritt, da es 
sich um ein Windows-System handelt, oder ob ich tatsächlich etwas falsch 
programmiert habe!?
Solche Fehler sind immer ganz hässlich zu finden.

Hoffe jemand kann mal schnell drüber schauen!

Viele Grüße
Maik
Angehängte Dateien:
Gast #2401335
Lesenswert?

Hallo,
ich habe etwas ähnliches auf einem Arduino programmiert.

Aufruf:
 mystate = Statmen.StateMachine(mystate,mystimuli);
/***************************************/
statemen.h

typedef struct {
  char state;
  char input;
  char nextstate;
  }M_NEXT_STATE;

static M_NEXT_STATE mnextst[] = {
    {ST_START,                  KEY_NEXT,   ST_TIME},
    {ST_START,                  KEY_PREV ,  ST_OPTIONS},
   //     usw.
}

typedef struct {
  unsigned char state;
  char *pText;
  char (*pFunc)(char input);
  }M_STATE;

static M_STATE mstate[] = {
    {ST_START, MT_START,                     NULL},
    {ST_TIME,  MT_TIME,                      NULL},
    {ST_TIMEMOD, MT_TIMEMODE,                  NULL},
    {ST_OPTIONS, MT_OPTIONS,                   NULL},
{ST_TIME_CLOCK_FUNC, NULL,     PR_TIME_CLOCK_SET},
//  usw.
}
/*****************************************/

statemen.cpp

unsigned char MyStatmen::StateMachine(char state, unsigned char stimuli)
{
unsigned char nextstate = state;
unsigned char i;
  for (i=0 ; mnextst[i].state ; i++)
  {
       // LCDchar(mnextst[i].state);
    if((mnextst[i].state == state) && (mnextst[i].input == stimuli))
    {
        nextstate = mnextst[i].nextstate;
       // break;
    }
  }

 if (nextstate != state)
       {
           state = nextstate;
           for (i=0; mstate[i].state; i++)
           {
             if (mstate[i].state == state)
               {
          statetext =  mstate[i].pText;
                pStateFunc = mstate[i].pFunc;
                break;
               }

           }
  if(statetext)
  LCDstr(statetext);
  if(pStateFunc)
  nextstate = pStateFunc(state);

  }
  return nextstate;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren