Forum: Compiler & IDEs Mehrdimensionales Array für Zustandsautomaten


von klaus (Gast)


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 ?

von Karl H. (kbuchegg)


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.

von klaus (Gast)


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.

von Karl H. (kbuchegg)


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 :-)

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.