В приведенном ниже коде я не могу определить способ передачи функции-члена в общий корневой поиск.Передача функции функции-члена функции без класса
#include <stdio.h>
double OneDimBisector(double (*fun)(float), float a, float b, float tol){
double val;
val = (*fun)(0.5*(b-a)); // actually: do proper bisection
return val;
}
class EOS {
public:
double S_array[10][10]; // actually: filled by constructor
double S(double T, double P);
double T_PS(double P, double S);
double functForT_PS(double T);
double (EOS::*pfunctForT_PS)(double);
double Sseek, Pseek;
};
double EOS::S(double T, double P){
double val = T+P; // actually: interpolate in S_array
return val;
}
double EOS::functForT_PS(double T){
return S(T,Pseek)-Sseek;
}
// Find T from P and S (T is invertible), assuming the intervals are ok
double EOS::T_PS(double P, double S0){
double Tmin = 2., Tmax = 7., T1, tol=1e-8;
pfunctForT_PS = &EOS::functForT_PS;
Sseek = S0;
Pseek = P;
printf("\n %f\n", (*this.*pfunctForT_PS)(4.)); // no problem
T1 = OneDimBisector(pfunctForT_PS, Tmin, Tmax, tol); // wrong type for pfunctForT_PS
return T1;
}
int main() {
double P=3., S=8;
EOS myEOS;
printf("\n %f %f %f\n",P,S,myEOS.T_PS(P,S));
}
Я не хочу, чтобы корневой радиопеленгатор элемента, потому что это не относится к этому классу, и решение сделать все static
кажется очень безвкусным. У кого-нибудь есть идея? Это, должно быть, обычная ситуация, но я не нашел подходящего сообщения, которое мне было понятно.
Спасибо!
Edit: На самом деле, я хотел спросить: Есть ли собственно, потокобезопасный способ настройки Pseek
переменных, кроме того, что я сделал? Просто, чтобы дать понять: я делаю одномерный поиск корня на двумерной функции, но фиксируя один из двух аргументов.
Сделать это шаблон? – elmo
Вы не можете передать указатель на функцию-член как указатель на регулярную функцию. Можете ли вы изменить OneDimBisector, чтобы принимать разные аргументы? –
@VaughCato Я могу изменить его, но он должен оставаться общим. Я не хочу, чтобы в коде использовалось много копий корневого искателя, так как он используется в разных классах! – Labbedudl