2015-09-22 56 views
0

我有编译和运行使用WIN 32平台在Visual Studio 2012年改变了平台,X64之后的程序,它提供了以下错误信息:编译器错误C2664

“test_integration.cpp( 27):error C2664:'hcubature_v':无法将参数2从'int(__cdecl *)(unsigned int,unsigned int,const double *,void *,unsigned int,double *)'转换为'integrand_v'“

任何人都可以提供一些建议吗?谢谢!

#include <iostream> 
#include "cubature.h" 
#include <ctime> 
#include <limits> 
using namespace std; 

int f_v(unsigned ndim, unsigned npts, const double *x, void *fdata, unsigned fdim, double *fval) { 
    double sigma = *((double *) fdata); 
    unsigned i, j; 
    for (j = 0; j < npts; ++j) { // evaluate the integrand for npts points 
     double sum = 0; 
     for (i = 0; i < ndim; ++i) sum += x[j*ndim+i] * x[j*ndim+i]; 
     fval[j] = exp(-sigma * sum); 
    }; 
    return 0; // success 
} 

int main(){ 

    double xmin[3] = {-2,-2,-2}, xmax[3] = {2,2,2}, sigma = 0.5; 
    double val_v,err_v, time_v; 
    const clock_t begin_time_v = clock(); 

    for (int j = 0; j<1000;j++) 
    { 
    // hcubature_v calculates a multidimensional integration. 
    hcubature_v(1, f_v, &sigma, 1, xmin, xmax, 0, 0, 1e-4, ERROR_INDIVIDUAL, &val_v, &err_v); 
    } 

    cout << float(clock() - begin_time_v)/CLOCKS_PER_SEC<<endl; 
    printf("Computed integral = %0.10g +/- %g\n", val_v, err_v); 
    cin.get(); 
} 

这里有一些额外的定义:

/* a vector integrand of a vector of npt points: x[i*ndim + j] is the 
    j-th coordinate of the i-th point, and the k-th function evaluation 
    for the i-th point is returned in fval[i*fdim + k]. Return 0 on success 
    or nonzero to terminate the integration. */ 
typedef int (*integrand_v) (unsigned ndim, size_t npt, 
       const double *x, void *, 
       unsigned fdim, double *fval); 

/* as hcubature, but vectorized integrand */ 
int hcubature_v(unsigned fdim, integrand_v f, void *fdata, 
     unsigned dim, const double *xmin, const double *xmax, 
     size_t maxEval, double reqAbsError, double reqRelError, 
     error_norm norm, 
     double *val, double *err); 
+0

您需要下载软件包http://ab-initio.mit.edu/wiki/index.php/Cubature以运行程序。 –

+1

跳出的第一件事是'f_v'的第二个参数应该是'size_t',而不是'unsigned'。 –

+0

非常感谢! @R_Kapp –

回答

0

您应该使用用于定义integrand_v的确切类型。

相反的:

int f_v(unsigned ndim, unsigned npts, const double *x, void *fdata, unsigned fdim, double *fval) { 
         ^^^^^^ 

使用

int f_v(unsigned ndim, size_t npt, const double *x, void *fdata, unsigned fdim, double *fval) { 
         ^^^^^^ 

它工作在32位可能是因为size_tunsigned恰巧是同一类型。

它不能在64位工作,因为它们是不同的类型。

+0

这很有效,谢谢!@R Sahu –