Forum: Mikrocontroller und Digitale Elektronik Menü für uController


von Maik K. (Gast)


Angehängte Dateien:

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
von kittekaak (Gast)


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;
}
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.