Mehrdimensionales Array für Zustandsautomaten

Gast #1726007
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):

1
const TRANSITION_T transitions[NUMBER_OF_STATES][] =
2
{
3
  // state 0 transitions
4
  {
5
    { /* first transition */ },
6
    { /* second transition */ },
7
    { /* third transition */ }
8
  },
9
  // state 1 transitions
10
  {
11
    { /* only one transition */ }
12
  },
13
  // ...
14

15
};

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:

1
const STATE_T states[NUMBER_OF_STATES] =
2
{
3
  // state 0
4
  {
5
    3u,                    /* 3 transitions for state 0 */
6
    &(transitions[0][0]),  /* ptr to array of transitions of state 0 */
7
    // ...
8
  },
9
  // state 1
10
  {
11
    1u,                    /* 1 transition for state 1 */
12
    &(transitions[1][0]),  /* ptr to array of transitions of state 1 */
13
    // ...
14
  }
15

16

17
};

Die Zustände lassen sich wie gezeigt darstellen, die Transitionen aber 
nicht... jemand eine Idee ?
#1726116
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.
Gast #1726251
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.

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