www.mikrocontroller.net

Forum: Compiler & IDEs command liste


Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
baue mir gerade eine kleine shell über die UART. Ich hab schon oft sowas
gemacht aber sonst immer die commandliste von hand gebaut mit switch und
so, geht, find ich aber irgendwie hässlich! Das ganze kann man ja auch
universeller machen. ich sehe das oft mal da wird dann eine liste
gebaut wie:
(pseudocode)
cmdlist = { "setup", setup_func, .... } usw.

wenn ich jetzt durch diese liste durchloopen würde, dann immer den
commandkey ("setup") mit der eingabe vergleiche wie würde ich dann
klarmachen, dass setup_func eine funktion ist die dann aufgerufen
werden soll? Hat jemand ne idee? danke :)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du definierst das Element als Funktionszeiger. Vielleicht hilft
folgendes:
struct cmd
{
    const char* name,
    void (*func)(void);
};

struct cmd cmdlist[] =
{
    { "setup", setup_func},
    { 0, 0}
};

...

int execute(const char* command)
{
    for (cmd* c = cmdlist; cmd->name != 0; ++cmd)
    {
        if (strcmp(cmd->name, command))
        {
            cmd->func();
            return 1;
        }
    }
    printf("Unknown command\n");
    return 0;
}

Wenn du noch Parameter übergeben willst, mußt du dir halt überlegen,
wie du das einbaust.

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke das ist genau was ich haben wollte!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist ja gut. Das Finden der (wie ich gerade sehe) zahlreichen Fehler
bleibt als Übung ;-)

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber warum krieg ich denn storage size of cmdlist isnt known?

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und strcmp returned 0 wenn der vergleich positiv ist ;)

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so hab glaub ich alle gefunden :p

struct cmd
{
  const char* name;
  void (*func)(void);
};

void poll()
{
  float val = ((float)ADC/1024.0f)*5.0f;
  char string[10];
  dtostrf(val,5,1,string);
  printf("Polling.....\nADC: %sV\n",string);
}


struct cmd cmdlist[] =
{
  { "poll", poll },
  { 0, 0 }
};


int execute(const char* command)
{
  struct cmd *c = 0;
  for (c = cmdlist; c->name != 0; ++c) {
    if (!strcmp(c->name, command)) {
      c->func();
      return 1;
    }
  }
  printf("Unknown command\n");
  return 0;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.