警告:从不兼容的指针类型分配[-Wincompatible-pointer-types] qt1.function =& H1

时间:2017-06-21 13:00:59

标签: c pointers structure gsl

我在C编程语言中使用gsl库集成了一个复杂的函数。在这段代码中,我必须使用已成功完成的指针声明两个变量。但是当我在main函数中传递这些变量时,我遇到了一个问题。

请帮帮我。

我的代码写在这里:

struct har{

double t;
double k;
double x;
};

#include"str.h"
struct har H1( void  * params, float q , int p )

    {

    struct har  *p_params = (void *)params;


    float  mu=2;
    double x =p_params ->x ;
    double t = p_params -> t;
    double  k = p_params -> k;
    //printf("%d",k);
    struct har  H1 =  {x*cos(t*x)/(pow((mu*t*k),2)+pow(x,2))};
    return H1;
    }


 double H (double x,void * params )
{
double e;
double t = *(double *) params;
//printf("%f\n",t);
//struct har t1,z;
//double t = z.params ->t1;
double H  = (pow(e,-x)/x) ;//I(x,&t)*(sin(x*t));  
return H;
}


#include<stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include"H.h"
#include"H1.h"

int
main (void)
{
  gsl_integration_workspace * w
    = gsl_integration_workspace_alloc (10000);

  struct har t,k;

  double x, qtr, qbartr, qdottr, qddotr,q7r, qatr, qbtr, qt1r, error;
  double expected = -4.0;
  double a1 = 1e-14;
  double a= 150;//150;
  double pi = 3.141;
  double b = 1.05263;
  double mu = (2*pi)/b;
  double q0=0;
  double p0=6.5;
  double om=7.07;
  double tau=0.141;
  double gamma = 0.180;

for(int m=2; m<4; m++)
{


 float  t = 4.14937*(m-1);


 gsl_function qt;
 qt.function = &H;
 qt.params =&t;
 gsl_integration_qags (&qt, a1, a, 0,1e-7, 10000, w, &qtr, &error);
// printf ("qtresult = % .18f\n\n", qtr);

 for(int k=1; k<=2; k++)
    {
      {
struct har item = {x,t,k};
struct har *p_params = &item;


       double  gama=gamma/((mu*k*tau)+1);
//      printf("gama = % .18f\n", gama);

       gsl_function qt1;

       qt1.function = &H1;
       qt1.params = &p_params;
    // qt1.params = &k;
       gsl_integration_qags (&qt1, a1, a, 0,1e-7, 10000, w, &qt1r, &error);
      printf("qt1result= % .18f\n", qt1r);


     }

}


  gsl_integration_workspace_free (w);

  return 0;
}

在上面的代码中我有四个文件,即code.c,str.h,H1.h和H.h.其中H1和H包含两个用户定义的函数,str是结构文件,而code.c是我编译的主要文件。

感谢您的时间和观察。

问候

拉梅什

1 个答案:

答案 0 :(得分:1)

字段qt1.function的类型为double (*)(double, void *)。您尝试分配给此字段的函数H1的类型为struct har (*)( void *, float, int)

这些类型不兼容,因为参数的数量,参数的类型和返回类型都是不同的。就像现在一样,您有两个名为pq的参数永远不会被使用。另外,你构造为返回值的struct har甚至没有设置所有字段,只是第一个字段,所以你为什么还要返回一个结构?

要使H1gsl_function一起使用,必须接受doublevoid *并返回double }。 x值对应于传入的double,因此您的结构中不需要它。由于您还只构建一个值来返回,这就是您返回的内容。

struct har{
    double t;
    double k;
};

double H1( double x, void  *params)
{
    struct har *p_params = params;   // no need to cast to/from void *

    float mu=2;
    double t = p_params->t;
    double k = p_params->k;

    return  x*cos(t*x)/(pow((mu*t*k),2)+pow(x,2));
}

另外,您没有正确设置qt1的值:

qt1.params =&amp; p_params;

由于p_paramsstruct har *,因此其地址为struct har **。但是你的函数期望传入struct har *。所以将它改为struct的地址,而不是指向它的指针的地址:

qt1.params = &item;

设置qt.params时,您也会遇到不匹配问题。您给的是float *,但您的函数H期待double *。只需将t的类型更改为匹配:

double t = 4.14937*(m-1);