Gcc 用g+编译GSL-odeiv2+;

Gcc 用g+编译GSL-odeiv2+;,gcc,g++,gsl,Gcc,G++,Gsl,我正在尝试使用g++编译与ODE解算器相关的示例代码,gsl/gsl_odeiv2。以下代码来自其网站: http://www.gnu.org/software/gsl/manual/html_node/ODE-Example-programs.html 在gcc下编译良好,但g++会抛出错误 从“void*”到“int(*)的转换无效(double,const double*,double*,double*, void*)'[-fppermissive] 在守则中: #include <

我正在尝试使用g++编译与ODE解算器相关的示例代码,
gsl/gsl_odeiv2
。以下代码来自其网站:

http://www.gnu.org/software/gsl/manual/html_node/ODE-Example-programs.html

在gcc下编译良好,但g++会抛出错误

从“void*”到“int(*)的转换无效(double,const double*,double*,double*,
void*)'[-fppermissive]

在守则中:

#include <stdio.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv2.h>

int func (double t, const double y[], double f[], void *params)
{
    double mu = *(double *)params;
    f[0] = y[1];
    f[1] = -y[0] - mu*y[1]*(y[0]*y[0] - 1);
    return GSL_SUCCESS;
}


int * jac;

int main ()
{
    double mu = 10;
    gsl_odeiv2_system sys = {func, jac, 2, &mu};

    gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rkf45, 1e-6, 1e-6, 0.0);
    int i;
    double t = 0.0, t1 = 100.0;
    double y[2] = { 1.0, 0.0 };

    for (i = 1; i <= 100; i++)
    {
        double ti = i * t1 / 100.0;
        int status = gsl_odeiv2_driver_apply (d, &t, ti, y);

        if (status != GSL_SUCCESS)
        {
            printf ("error, return value=%d\n", status);
            break;
        }

        printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
    }

    gsl_odeiv2_driver_free (d);
    return 0;
}
#包括
#包括
#包括
#包括
int func(双t,常数双y[],双f[],void*params)
{
双μ=*(双*)参数;
f[0]=y[1];
f[1]=-y[0]-mu*y[1]*(y[0]*y[0]-1);
返回GSL_成功;
}
国际*jac;
int main()
{
双μ=10;
gsl_odeiv2_系统sys={func,jac,2,&mu};
gsl_odeiv2_driver*d=gsl_odeiv2_driver_alloc_y_new(&sys,gsl_odeiv2_step_rkf45,1e-6,1e-6,0.0);
int i;
双t=0.0,t1=100.0;
双y[2]={1.0,0.0};

对于(i=1;i看来您在雅可比矩阵方面有一些问题。在您的特定情况下,您可以在系统的定义中使用NULL而不是jac,即

gsl_odeiv2_system sys = {func, NULL, 2, &mu};
一般来说,雅可比必须是一个具有特定条目的函数-请参阅gsl手册-这就是编译器抱怨的原因

此外,您可能需要手动链接gsl库:

-L/usr/local/lib -lgsl

如果您使用的是linux系统。

谢谢,这确实是个问题。我声明了一个雅可比矩阵作为相关参数的函数,但它没有任何作用,但下次我将使用NULL,因为它更干净。