mikrocontroller.net

Forum: Compiler & IDEs Mehrdimensionales Array für Zustandsautomaten


Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte einen Zustandsautomaten realisieren, bei dem jeder Zustand 
eine unterschiedliche Anzahl ausgehender Transitionen haben kann.

Konkret ist die Frage wie dies (die Transitionen) in C abgebildet werden 
können.

Ideal wäre soetwas wie (nur das geht leider nicht):

const TRANSITION_T transitions[NUMBER_OF_STATES][] =
{
  // state 0 transitions
  {
    { /* first transition */ },
    { /* second transition */ },
    { /* third transition */ }
  },
  // state 1 transitions
  {
    { /* only one transition */ }
  },
  // ...

};

TRANSITION_T ist ein struct welches alle Infos über eine Transition 
speichert. NUMBER_OF_STATES ist die Gesamtanzahl der Zustände.

Die Zustände werden in einem Array gespeichert, das pro Zustand einen 
Zeiger auf ein Transition-Array (mit einer unterschiedlicher Anzahl 
Elementen) enthält:

const STATE_T states[NUMBER_OF_STATES] =
{
  // state 0
  {
    3u,                    /* 3 transitions for state 0 */
    &(transitions[0][0]),  /* ptr to array of transitions of state 0 */
    // ...
  },
  // state 1
  {
    1u,                    /* 1 transition for state 1 */
    &(transitions[1][0]),  /* ptr to array of transitions of state 1 */
    // ...
  }


};

Die Zustände lassen sich wie gezeigt darstellen, die Transitionen aber 
nicht... jemand eine Idee ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der springende Punkt ist, dass jede Zeile in deinem 2D Array dieselbe 
Anzahl an Elementen haben muss.
Daher ist es so nicht möglich ein Array aufzubauen, welches für einzelne 
States weniger Transistionen benötigt.

Auch wenn ich die Fragestellung zur Hälfte nicht verstanden habe, denke 
ich die Lösung deines Problems könnte darin liegen, für jeden State ein 
eigenes Array an Transitionen anzulegen und aus dem State Array zu 
verpointern.

Im übrigen solltest du dann auch den Compiler damit beauftragen, die 
korrekte Anzahl an Trasitionen einzutragen. Mit einezelnen Transistion 
Arrays für jeden State ist das dann ja auch kein Problem mehr.

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der springende Punkt ist, dass jede Zeile in deinem 2D Array dieselbe
> Anzahl an Elementen haben muss.
> Daher ist es so nicht möglich ein Array aufzubauen, welches für einzelne
> States weniger Transistionen benötigt.
>
> Auch wenn ich die Fragestellung zur Hälfte nicht verstanden habe, denke
> ich die Lösung deines Problems könnte darin liegen, für jeden State ein
> eigenes Array an Transitionen anzulegen und aus dem State Array zu
> verpointern.

Werde ich dann machen müssen. Hatte gehofft (oder krampfhaft versucht) 
eine Lösung zu finden bei welcher man nicht für jeden Zustand ein neues 
Array anlegen muss. Hatte mir zwischenzeitlich auch überlegt die 2te 
Dimension des Transition Arrays einfach anzugeben, wäre aber wohl 
ziemliche Speicherverschwendung...

> Im übrigen solltest du dann auch den Compiler damit beauftragen, die
> korrekte Anzahl an Trasitionen einzutragen. Mit einezelnen Transistion
> Arrays für jeden State ist das dann ja auch kein Problem mehr.

Guter Punkt und gute Idee.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klaus schrieb:

>> Im übrigen solltest du dann auch den Compiler damit beauftragen, die
>> korrekte Anzahl an Trasitionen einzutragen. Mit einezelnen Transistion
>> Arrays für jeden State ist das dann ja auch kein Problem mehr.
>
> Guter Punkt und gute Idee.

Wo Schatten ist, muss auch zumindest ein wenig Licht sein :-)

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.