2017-02-11 147 views
0

我想集成一個函數與gsl。因此,我必須定義一個函數f(integrant必須是double (*)(double, void*)的形式)。對於gsl集成方法的調用,我需要定義一個結構體,它包含一個指向函數的指針(該結構體被稱爲gsl_function)。指向一個對象的成員函數的指針

gsl_function F; 
F.function = &MyClass::my_f; 

功能f必須在類(在相同的類從該積分過程應該被稱爲)來實現。我該如何分配上面正確的指針,因爲2號線未編譯和導致錯誤:

cannot convert ‘double (MyClass::*)(double, void*)’ to ‘double (*)(double, void*)’ in assignment. 

這裏的my_f

struct my_f_params { double a; double b;}; 

    double my_f (double x, void * p) { 
    struct my_f_params * params = (struct my_f_params *)p; 
    double a = (params->a); 
    double b = (params->b); 
    return 1.0/(sqrt(a * (1.0 + x)*(1.0 + x)*(1.0 + x) + (1-a) * std::pow((1.0 + x), (3.0 * (1.0 + b))))); 
    } 
+0

您需要在那裏提供'static'成員函數作爲回調函數。我想''void *'參數可以被(錯誤)用來在必要時傳遞'this'指針。 –

+0

指向成員的指針不是普通的指針。你將不得不把它包裝在一個平面的功能。 SO上有很多這種技術的例子。 –

+1

想一想'gsl_function :: function'的'void *'參數。它可能用於什麼? –

回答

1

which has to be of the form double (*)(double, void*)

非靜態成員函數聲明的定義涉及隱含的通話範圍限定符如錯誤消息中所述

double (MyClass::*)(double, void*) 
    // ^^^^^^^^^ 

這與回調函數指針定義不同。

你也許可以用這樣的界面做的,是通過回調函數的void*參數傳遞this指針:

class MyClass { 
    static double func(double d,void* thisPtr) { 
     MyClass* myClass = (MyClass*)thisPtr; 
     // do something 
    } 
}; 

如前所述in the documentation你可以把params像在一個包裝類:

class gsl_function_wrapper { 
public:  
    gsl_function_wrapper() { 
     F.function = &func; 
     F.params = this; 
    } 
private: 
    gsl_function F; 

    double a; 
    double b; 

    static double func(double d,void* thisPtr) { 
     gsl_function_wrapper* myWrapper = (gsl_function_wrapper*)thisPtr; 
     // do something with a and b 
     foo(d,myWrapper->a,myWrapper->b); 
    } 
}; 
+0

請提供正確的引用,告訴您獲得此解決方案的位置(不在GSL網站上)。可能的正確來源 - https://stackoverflow.com/a/18413206/2472169 –

相關問題