Cの古いコードを現在のVC++プロジェクトに結合しようとしています。
// .h
class DMSinv : public CDialog {
double finte(double z);
double ITFStolz(double Zp1, double Zp2, double Zc);
};
// .cpp
double Zcglob;
double DMSinv::finte(double z)
{
return TFStolz(z, Zcglob);
}
double DMSinv::ITFStolz(double Zp1, double Zp2, double Zc)
{
int ierr;
Zcglob = Zc;
return (coteglob(&DMSinv::finte, Zp1, Zp2, 1.0e-10, &ierr));
//error C2664: 'DMSinv::coteglob' : cannot convert parameter 1 from 'double (__thiscall DMSinv::* )(double)' to 'double (__cdecl *)(double)'
}
coteglob関数は古いC部分に由来し、finteはTFStolz関数をcoteglobに渡すための中間関数です。
私はフォーラムを検索し、この関連する質問を見つけました: void(__thiscall MyClass :: *)(void *)を この方法で適用しようとしたvoid(__cdecl *)(void *)ポインターに変換する方法:
// .h
class DMSinv : public CDialog {
virtual double finte(double z);
double ITFStolz(double Zp1, double Zp2, double Zc);
};
// .cpp
double Zcglob;
extern "C"
{
static double __cdecl finteHelper(double z)
{
DMSinv* datainv = reinterpret_cast< DMSinv > (z); //error C2440: 'reinterpret_cast' : cannot convert from 'double' to 'DMSinv'
datainv->finte(z);
}
}
double DMSinv::ITFStolz(double Zp1, double Zp2, double Zc)
{
int ierr;
Zcglob = Zc;
double solution = coteglob(&finteHelper, Zp1, Zp2, 1.0e-10, &ierr);
return solution;
}
しかし、まだ機能していません。誰かがそれを適応させる方法について私を導くことができますか?私はまだかなりの初心者であり、これは私の知識からはほど遠いようです。
前もって感謝します!