PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion gibt Funktion zurück... nächstes Problem



Jaecko
19.12.2008, 09:36
Moin.

Ein kleines Problem, bei dem ich jetzt nicht ganz weiss, wie ich's erklären soll, damits verständlich wird...

(Info: main und MAIN sind 2 unterschiedliche Funktionen!)

Meine main sieht so aus:


int main(void)
{
typedef void(*fptr_t)(void);
volatile fptr_t FPTR;

FPTR = MAIN;
while(1)
{
FPTR();
}

return(0);
}

Die void-Funktion MAIN wird aufgerufen. Wenn ich nun in der MAIN der (globalen) Zeigervariable FPTR eine andere Funktion zuweise, die MAIN dann per return beende, wird entsprechend die andere Funktion ausgeführt. Klappt soweit auch gut.

Jetzt möcht ich das ganze aber in dem folgenden Stil machen, dass die globale Variable nur noch lokal sein muss und ich in der aktuellen Funktion einach sagen kann: return (nächste Funktion);...



while(1)
{
FPTR = FPTR();
}


... dass also die gerade ausgeführte Funktion als Rückgabewert die
Funktion der nächsten auszuführenden Funktion an den Zeiger übergibt und beim nächsten Durchlauf der Schleife ausführt.

Versuche ich das so, meckert der Compiler an der Zeile "FPTR = FPTR();"
"error: void value not ignored as it ought to be"

Ok, klar, MAIN ist noch eine void.
Dann hab ich die Deklaration für die MAIN geändert:
fptr_t MAIN(void)

Geht aber auch nicht. Zusätzlich zu dem Fehler bringt der compiler jetzt auch bei der Initial-Zuweisung "FPTR = MAIN;" den Fehler:
"warrning: assignment from incompatible pointer type"

Ich hoff, mein Problem ist einigermassen verständlich.
Hat hier jemand ne Idee dazu?

mfG



(PS: Warum das ganze? Damit mehrere Funktionen, die zur Zeit "ineinander" aufgerufen werden, nacheinander ausgeführt werden, um so nicht Unmengen an Stack zu verschwenden.)

thewulf00
19.12.2008, 09:47
Versuch es mal mit einem Cast.



while(1)
{
FPTR = (fptr_t)FPTR();
}

Jaecko
19.12.2008, 09:51
Ändert nichts. Die Fehler/Warnungen bleiben.

Nachtrag: Der Cast beim Initialwert bringt was, der Fehler mit dem ignored void bleibt aber.

Nachtrag 2: Anscheinend hab ich den Fehler grad behoben.
"Einfach" eine 2. Typedef dazu...


typedef void(*vfptr_t)(void);
typedef vfptr_t(*fptr_t)(void);


Und dann doch noch den Cast bei FPTR = (fptr_t)FPTR();, dann bringt der Compiler weder Warnungen noch Fehler.
(Ok, ich weiss, einfach rummurksen, bis der Compiler ruhig ist, ist nicht immer die beste Möglichkeit. Aber wenns so geht, lass ichs mal so)

Werd Nachmittag mal prüfen, ob das Programm dann auch so läuft wie's soll.