【发布时间】:2012-05-17 16:39:10
【问题描述】:
我正在使用 C++ 开发我的代码,并希望使用 MPFIT 非线性曲线拟合库,该库是用 C 开发的,但允许在 C++ 中编译。
例如我有一个名为“myClass”的类,而这个类有一个函数myClass::Execute()
我在 myClass.h 文件中包含“mpfit.h”。并尝试从 Execute() 调用一个名为 mpfit 的函数。
int status = mpfit(ErrorFunction, num1, num2, xsub_1D, 0, 0, (void *) &variables, &result);
问题是 ErrorFunction 是 myClass 的一个函数。所以当我尝试使用它时编译器会出错。我试图将 ErrorFunction 带出类对象,但这次我得到了下面给出的错误:
ErrorFunction 在类之外时出错:
错误 4 错误 C2664: 'mpfit' : 无法从 'int 转换参数 1 (__cdecl *)(int,int,double *,double,double *,void *)' 到 'mp_func'
ErrorFunction 在类内时出错:
Error 3 error C3867: 'myClass::ErrorFunction': function call missing argument list; use '&myClass::ErrorFunction' to
误差函数定义:
int ErrorFunction(int dummy1, int dummy2, double* xsub, double *diff, double **dvec, void *vars)
如何调用这个函数并将其解析成 mpfit,它是一个 C 函数?
mp_func 定义为:
/* Enforce type of fitting function */
typedef int (*mp_func)(int m, /* Number of functions (elts of fvec) */
int n, /* Number of variables (elts of x) */
double *x, /* I - Parameters */
double *fvec, /* O - function values */
double **dvec, /* O - function derivatives (optional)*/
void *private_data); /* I/O - function private data*/
【问题讨论】:
-
作为一个附带问题,请注意不要在 C++ 回调函数中抛出任何未捕获的异常。根据架构,您可能会发现如果没有段错误或类似情况,它们将无法通过 C 调用堆栈。
-
@Component10:即使他们确实通过了 C 调用堆栈,C 代码也有可能由于异常而泄漏内存。因此,如果他们确实在没有段错误的情况下成功,这并不是什么大优势,尽管它可能对调试有所帮助。
标签: c++ c visual-c++ casting