[C] Zeiger auf Funktionen

DelphiKing

King with a crown
ID: 46719
L
20 April 2006
6.553
729
Aloha,

darf mich im Zuge von Microcontroller-Programmierung mit C befassen und stehe vor einem nervigen Fehler, den ich nicht finde :wall:

Folgender (gekürzter) Code, der Zeiger auf Funktionen in einem Array speichert und diese Funktionen dann über die Zeiger zu gegebenem Anlass aufruft (z.B. wenn ein Intervall verstrichen ist):
PHP:
// Struktur die Zeiger auf Funktionen und Aufrufintervalle speichert
typedef struct {
        int interval;
        void (*fct)(void);
} cb_TimedFct;
cb_TimedFct TimedFunctions[10]; // Array der Struktur

// Funktion hinzufügen
int addFunction(void(*_fct)(void), int _interval) {
    // Werte ins Array speichern (vereinfacht: an Pos "1")
    TimedFunctions[1].interval = _interval;
    TimedFunctions[1].fct = _fct;  // muss hier ein (*_fct) stehen?
    //...
}

// Timer-Funktion (die durch irgendwas aufgerufen wird), führt alle Fkt. aus
void Timer() {
   int i;
     for (i=0;  i<10;i++) {
       // Fkt. aufrufen
       TimedFunctions[i].fct();  // mit Klammern ()? Mit (*...) ? Mit (&...)?
     }
}

void test(void) {
     // Code der irgendwas macht/ausgibt/...;
}

int main(void) {
  // Funktion "test" zum Fkt-Array hinzufügen
  addFunction(test, 500);  // mit (*...)? Mit Klammern ()?
}

Ich habe Ewigkeiten rumprobiert und nachgelesen, aber nie etwas funktionierendes hinbekommen - irgendwo hab ich wohl einen Syntaxfehler, der ein anderes als das gewünschte Verhalten provoziert ... bin halt nicht so fit in C, bin inzwischen eher C# gewöhnt und mach da auch nix mit Zeigern :-?

Es wird einfach die Funktion test() nicht aufgerufen ...

Dass der Code so wie er da steht, ziemlich sicher falsch ist, ist mir klar... ich habe eben hier mal einen Zeiger hingemacht und dort wieder weg etc ... weil es so, wie ich es mir überlegt hatte, leider nicht ging. Dann kam noch hinzu, dass völlig wirre Dinge passieren, wenn ich "()" hinter den Fktsname. setze - scheint ja ein Unterschied zu sein x_x

Hat irgendwer Ahnung?


Lg, flo
 
Im Prinzip gehts so:
PHP:
void foo(void) {}

// Zeiger auf void ...(void)-Funktion
void (*func_ptr)(void);

// Zuweisung. Jede Funktion ist automatisch Speicheradresse
func_ptr = foo; // foo ist eine Adresse

// Aufruf durch Deferenzieren der Adresse! (dein Fehler)
// func_ptr ist nur die Adresse, du willst das, was an der Adresse is,
// also * benutzen.
(*func_ptr)();
PHP:
(*(TimedFunctions[i].fct))();
edit:
Hab vorsichtshalber noch mal Klammern eingefügt. Probiers aus, obs funktioniert. Sonst halt mal Debugger anwerfen, was du in der Struct stehen hast.

edit2:
Die Dereferenzierung sollte eigenltich auch überflüssig sein, d.h.
PHP:
func_ptr();
auch korrekt sein. Probier mal aus, einfach nur Klammern um die "Funktion" zu setzen, also ob
PHP:
(TimedFunctions[i].fct)();
bereits funktioniert.
 
Zuletzt bearbeitet:
Habs eben rausbekommen (hab die letzten 20 Min net ins Forum geschaut :wall: )

Auf meinen Code bezogen so:
PHP:
addFunction((*test), 500);

--> Zuweisung ins Array: TimedFunctions[1].fct = (*_fct);

--> Aufruf aus dem Array: (*TimedFunctions[1].fct)();

Erschwerend kam bei mir hinzu, dass ich ne Schleife von 0 statt von 1 hab loslaufen lassen, was dann grundsätzlich das Ergebnis verfälscht hat (weil n Register unkontrolliert überschrieben wurde).

Danke dir auf jeden Fall, theHacker :kiss: