Struct rekursiv: Wie löst man das?

Für mein Lieblingsthema SML hatte ich überlegt schön struct's anzulegen, was auch wunderbar klappt.


struct SML_Unit                                 // SML_Unit
{
  uint8_t smlunit;
};

struct SML_Signature                            // SML_Signature
{
  uint8_t *signature;
};

struct SML_PeriodEntry                          // SML_PeriodEntry
{
  uint8_t *objName;
  SML_Unit unit;
  int8_t scaler;
  SML_Value value;
  SML_Signature valueSignature;
}prdEntry;

Der Zugriff dann via: prdEntry.unit.smlunit bzw. prdEntry.valueSignature.signatureist richtig schick.
Aber ich habe mit zwei Strukturaufbauten ein Problem, da diese optional rekursiv sind. Zur Veranschaulichung:


parameterTree ist vom Typ SML-Tree.
In der Struktur von SML_Tree ist die optionale child_List vom Typ List_of_SML_Tree
und diese hat als einziges Element wieder SML_Tree...
grafik
Lässt sich sowas irgendwie als struct abbilden und wenn ja, wie?

//
struct List_of_SML_Tree                        // List_of_SML_Tree
{
  // **** Rekursiver Aufruf!!!
  // ist sequence of! Kann merere tree_entry haben
  // SML_Tree tree_Entry;
};
//
struct SML_Tree                                // SML_Tree
{
  uint8_t *parameterName;
  SML_ProcParValue parameterValue;
  List_of_SML_Tree child_list;
};

//

Ich bin jetzt am überlegen das als Funktion zu bauen, wüsste es aber trotzdem ob und wenn ja wie man da was reissen kann.

Siehe hier:
CooperativeTask.zip (11,0 KB)
Die Listenknoten wissen um die Liste und die Liste von ihren Knoten
Das ist eine zirkuläre Beziehung zwischen den Klassen, incl. ihrer Auflösung.

Meinst du das mit "Rekursiv"?

Oder sowas:

struct Inner
{
  Inner &inner;
  Inner():inner(*this){}
};


Inner test {*(new Inner)};

Zeige ein funktionierendes/fehlerhaftes Minimalbeispiel, so dass man erkennen kann was du willst.
Aus deiner Prosa werde ich nicht wirklich schlau.

Kurzsketch.
Das eine struct kennt das andere noch nicht.

struct List_of_SML_Tree                       
{
  SML_Tree tree_Entry;                         // SML_Tree ist hier noch nicht bekannt
};
//
struct SML_Tree                                
{
  // Noch mehr Einträge
  List_of_SML_Tree child_list;
};
//
void setup()
{}
//
void  loop()
{}

Also die erste Variante, wie bei meiner Liste.

struct SML_Tree;

struct List_of_SML_Tree                       
{
  // kaputt  SML_Tree tree_Entry;                         // SML_Tree ist hier noch nicht bekannt


  // SML_Tree &tree_Entry; // ok
  SML_Tree *tree_Entry; // ok

  
};
//
struct SML_Tree                                
{
  // Noch mehr Einträge
  List_of_SML_Tree child_list;
};
//
void setup()
{}
//
1 Like

Manchmal kann es auch einfach sein...
Danke!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.