2013-04-02 3 views
1

g ++를 사용하여 ODE 해석기와 관련된 예제 코드 gsl/gsl_odeiv2을 컴파일하려고합니다. 아래의 코드는 자신의 웹 사이트에서입니다 :g ++로 GSL odeiv2 컴파일

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

및 GCC에서 잘 컴파일하지만, g는 ++ 코드에서 오류

invalid conversion from 'void*' to 'int (*)(double, const double*, double*, double*, void*)' [-fpermissive]

를 던졌습니다 :

#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; 
} 

오류 줄에 주어진다

gsl_odeiv2_system sys = {func, jac, 2, &mu};

이 문제를 해결하는 데 도움이되는 내용은 환상적입니다. 일부 stdlib 요소를 포함하여 C++로 컴파일하려고합니다. 또한 g ++ (4.7)을 사용하여 컴파일 할 수 있다면 C++ 11을 사용하여 언어에 쉽게 멀티 스레드 할 수 있습니다. 고맙습니다.

답변

1

자코비언에 문제가있는 것 같습니다. GSL 설명서를 참조 - - 즉 컴파일러가 불평 왜 특정 경우에 당신은 당신 코비는 특정 항목과 기능을해야합니다 일반적으로 즉, 시스템의 정의 대신 JAC의

gsl_odeiv2_system sys = {func, NULL, 2, &mu}; 

를 NULL을 사용할 수 있습니다 .

또한, 수동으로 GSL 라이브러리를 링크 할 수 있습니다

-L/usr/local/lib -lgsl 

을 당신이 리눅스 시스템에있는 경우.

+0

정말로 고맙습니다. 나는 아무것도하지 않은 관련 인수의 함수로 자 코비안을 선언했지만, 다음 번에는 NULL로 처리 할 것이다. – Quentin

+0

도와 줘서 기뻤습니다 :-) –