Ich habe eine (nicht dynamisch erzeugte) SyntaxBaumstruktur, die ich rekursiv abarbeiten möchte. Alle Baumknoten liegen hintereinander in einem Array, das Ganze sieht so aus:
struct Node
{
unsigned short value;
unsigned short (\*evalFunc)(struct Node\* n);
};
struct Node nodes[10];
unsigned short sub(struct Node\* n)
{
//int result = 0;
//result = (++n)-\>evalFunc(n);
//result -= (++n)-\>evalFunc(n);
return (++n)-\>evalFunc(n) - (++n)-\>evalFunc(n);
}
unsigned short getValue(struct Node\* n)
{
return n-\>value;
}
void init()
{
nodes[0].evalFunc = ⊂
nodes[1].evalFunc = &getValue;
nodes[1].value = 30;
nodes[2].evalFunc = &getValue;
nodes[2].value = 20;
}
void main()
{
init();
printf("%i\n", nodes[0].evalFunc(&nodes[0]));
}
Der Fehler steckt in einer Zeile der Funktion Sub:
return (++n)->evalFunc(n) - (++n)->evalFunc(n);
Hier soll *erst* der nächste Knoten ausgewählt werden und *dann* die evalFunc-Funktion von diesem ausgeführt werden, so dass folgender Ablauf ist:
Erster Knoten: SUB
- Nachfolgender Knoten: evaluiert 30
- Nachfolgender Knoten: evaluiert 20
=> 30 - 20
Leider werden die Knoten-Adressen nicht zuerst erhöht. Der auskommentierte Code zeigt zwar, wie ich das Problem lösen kann, aber zum einen möchte ich den Fehler begreifen, zum anderen muß ich einen Weg finden, wie ich lokale Variablen (in dem Fall: result) wg. der Rekursion vermeide (läuft auf Microcontroller)