64位平台上的编译错误C2664

Compiler error C2664 on 64 bit platform

本文关键字:错误 C2664 编译 平台 64位      更新时间:2023-10-16

我有一个在Visual Studio 2012中使用win32平台编译和运行的程序。将平台更改为X64后,它给出以下错误消息:

" test_integral .cpp(27):错误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 +/- %gn", 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);

您应该使用用于定义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位工作,因为它们是不同的类型