У меня есть программа, которая компилируется и запускается на платформе win 32 в Visual Studio 2012. После изменения платформы на X64 выдается следующее сообщение об ошибке:
«test_integration.cpp (27): ошибка C2664: ‘hcubature_v’: невозможно преобразовать параметр 2 из ‘int (__cdecl *) (без знака int, без знака int, const double *, void *, без знака 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);
Вы должны использовать точные типы, которые используются для определения 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_t
а также unsigned
бывает того же типа.
Он не работает в 64-битных, так как они разных типов.
Других решений пока нет …