我在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是我编译的主要文件。
感谢您的时间和观察。
问候
拉梅什
答案 0 :(得分:1)
字段qt1.function
的类型为double (*)(double, void *)
。您尝试分配给此字段的函数H1
的类型为struct har (*)( void *, float, int)
。
这些类型不兼容,因为参数的数量,参数的类型和返回类型都是不同的。就像现在一样,您有两个名为p
和q
的参数永远不会被使用。另外,你构造为返回值的struct har
甚至没有设置所有字段,只是第一个字段,所以你为什么还要返回一个结构?
要使H1
与gsl_function
一起使用,必须接受double
和void *
并返回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_params
是struct har *
,因此其地址为struct har **
。但是你的函数期望传入struct har *
。所以将它改为struct的地址,而不是指向它的指针的地址:
qt1.params = &item;
设置qt.params
时,您也会遇到不匹配问题。您给的是float *
,但您的函数H
期待double *
。只需将t
的类型更改为匹配:
double t = 4.14937*(m-1);