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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.