2017-04-07 3 views
-3

Ich habe mich online für eine Weile umgesehen und ich habe nichts genau wie mein Problem gefunden. Ich verwende eine Klasse, die dieses Ding definiert:Wie man eine typedef Funktion als Parameter in C/C++ übergibt

typedef bool ProgressCallback(double progress); 

Es ist dann eine Funktion, die dies wie so verwendet:

// The documentation says that it will call progress_callback() 
// during the write where the progress parameter = percentage complete 
void WriteToFile(char* filename, ProgressCallback* progress_callback) 

Wie genau soll ich diese Funktion nennen ?? Es ist hauptsächlich die typedef-Syntax, die mich abstößt, weil es normalerweise nicht so schwierig ist, eine Funktion als Parameter zu übergeben. Hier ist, was ich versuchte, aber:

// Apparently I can't just say "Progress Callback MyCallback{}" 
// Since it gives me "function type may not come from a typedef" error 
bool MyCallbackFunction(double progress){ 
    return true; 
} 

void OtherFunction(){ 

    // Can't assign. I get "a value type of bool (*)(double progress)" cannot be 
    // used to initalize an entity of type ProgressCallback*" error. 
    ProgressCallback* myfunction = MyCallbackFunction; 
    WriteToFile("Test.txt", myfunction); 
} 

Offensichtlich weiß ich, dass ich das falsch mache. Aber das ist das nächste, was ich bekommen habe. Ich habe absolut keine Ahnung, wie ich dieses Argument in WriteToFile() übergeben soll.

Jede Hilfe würde sehr geschätzt werden!

+1

C hat keine Klassen. – melpomene

+0

Ein typedef deklariert nur einen Bezeichner als Alias ​​für einen Typ. In diesem Fall ist dieser Typ ein bestimmter Funktionstyp und Sie übergeben einen Zeiger an eine Funktion dieses Typs. Sie können die pointed-Funktion aufrufen, indem Sie den Zeiger dereferenzieren, um einen Funktionsbezeichner zu erhalten, und einen Funktionsaufruf-Ausdruck mit ihm bilden: '(* progress_callback) (0.5)'. –

+1

[Kann nicht reproduziert werden] (http://coliru.stacked-crooked.com/a/cfb3cb3a017f5269). Bitte geben Sie eine [MCVE] an. – Angew

Antwort

1

Gelöst verwenden! Ich musste dazu explizit eine Aufrufkonvention deklarieren. Also änderte ich:

bool MyCallbackFunction(double progress){ 
    return true; 
} 

zu

bool __stdcall MyCallbackFunction(double progress){ 
    return true; 
} 

und es scheint es jetzt zu akzeptieren.

2

Verwenden

typedef bool (*ProgressCallback)(double progress); 

ProgressCallback zu definieren.

Dann können Sie

ProgressCallback myfunction = MyCallbackFunction; 
WriteToFile("Test.txt", myfunction); 
+0

Ich würde das gern tun, aber es ist nicht meine Bibliothek, die ich modifizieren könnte, also bleibe ich irgendwie bei dem, was sie mir gegeben haben. – AnotherProgrammer

Verwandte Themen