Frage

Ich portiere einen C -Code in einer Ti -DSP -Chip -Umgebung. Ich masse mich mit dem C -Compiler auseinander.

Ich habe eine Datenstruktur, die einen Zeiger auf eine Funktion enthält. Ich habe eine Funktion, die die Datenstruktur initialisiert. Etwas wie das:

typedef void (*PFN_FOO)(int x, int y);

struct my_struct
{
    PFN_FOO pfn;
};

init_struct(struct my_struct *p, void *pfn)
{
    p->pfn = (PFN_FOO)pfn;
}

Unter Visual Studio und GCC diese Art von Code erfasst ohne Beschwerde. In der Tat, weil die pfn Argument ist Typ void * Ich muss nicht einmal eine Besetzung dort einstellen. Es würde nur implizit ohne Beschwerde gegossen.

In Code Composer Studio für die Ti DSP -Chips erhalte ich "Warnung: Ungültige Typkonvertierung".

Meine Richtlinie ist es, meinen Code ohne Warnungen kompilieren zu lassen, also möchte ich dies beheben. Ich habe alle möglichen Casting ausprobiert. Ich entdeckte, dass der Compiler vollkommen glücklich ist, wenn ich meine wirke void * Zeiger auf int Zuerst und dann auf den richtigen Typ werfen. EW, Yuck!

Wie kann ich diese Besetzung machen, ohne dass sich der Compiler beschwert? Muss ich wirklich zu werfen int den Compiler zum Schweigen bringen?

Hinweis: Ich bin speziell nicht Auf der Suche nach einer Lösung für den Effekt von "Veränderung init_struct() a zu akzeptieren a PFN_FOO anstelle einer void *"Das würde für diesen vereinfachten Code -Snippet funktionieren, aber nicht für den tatsächlichen Code funktionieren, der eine Liste möglicherweise heterogener Dinge erstellt.

War es hilfreich?

Lösung

Standard C unterstützt speziell keine Conversions zwischen Zeigern auf Datenobjekte und Zeiger auf Funktionen. GCC und Visual Studio unterstützen dies als Erweiterung.

Wenn Sie Ihre Funktion standardmäßig konform machen möchten (verwenden Sie trotzdem die void * Parameter) können Sie stattdessen einen Zeiger an einen Funktionszeiger übergeben. Dies funktioniert, weil Funktionszeiger selbst gewöhnliche Objekte sind void * Alles gut:

init_struct(struct my_struct *p, void *pfn)
{
    PFN_FOO *foo = pfn;
    p->pfn = *foo;
}

Der Anrufer muss dann eine temporäre Erstellung erstellen PFN_FOO Objekt, einen Zeiger zu übergeben, wenn er den Anruf tätigt:

PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);

Andere Tipps

Solltest du nicht schreiben?

typedef void (*PFN_FOO)(int x, int y);

Sieh dir das an Lernprogramm.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top