错误:被调用的对象不是函数或函数指针的双精度

时间:2017-07-13 11:56:01

标签: c gsl

我试图在我下面提到的代码中执行fft,但是我遇到了一些错误,我将在底部提到这段代码

#include<stdio.h>
#include<complex.h>
#include <gsl/gsl_integration.h>
#include"H.h"
#define REAL(z,i) ((z)[2*(i)])
#define IMAG(z,i) ((z)[2*(i)+1])

int
main (void)
{
  gsl_integration_workspace * w
    = gsl_integration_workspace_alloc (10000);
  double qr,error;
  double expected = -4.0;
  double a1 = 1e-14;
  double a= 150;//150;
  double pi = 3.1415;
  double T = 2500;
  double b = (315777/(1000*T));
  //printf("b = %f",b);
  double mu = (2*pi)/b;
  double om=7.15;
  double om1=7.267;
  int m;
    for( m=1; m<11; m++)
  {


  double  t = 4.14937*(m-1);

  struct har item = {t,mu};
  struct har *p_params = &item;

  gsl_function q;                               //ok
  q.function = &H;
  q.params =&t;

  gsl_integration_qags (&q, a1, a, 0,1e-7, 10000, w, &qr, &error);
  printf ("\nqtresult = % .18f\n", qr);
}

 gsl_integration_workspace_free (w);
}

用户定义函数H.h如下

#include"I.h"
#include"str.h"

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

结构文件和I.h如下

double I(double x)
{
        double gamma=0.182;
        double tau=0.41493;
        double om=7.1534;
        double I=(gamma*x)/(pow((pow(om,2)-pow(x,2)),2)*(1+pow((x*tau),2))+(2*gamma*x*((pow(om,2)-pow(x,2))*x*tau)+pow((gamma*x),2)));
//double I = pow(x,2);
return I;
}

用户定义函数I.h如下

struct har{

double t;
double k;
double mu;

};

上面编写的代码成功运行,直到我在代码中不包含complex.h头文件。 添加complex.h作为头文件后,我收到两个错误,如下所示:  1.错误:在test.c中包含的文件中:3:0:I.h:1:8:错误:预期标识符或'('在'扩展名'之前'' 2.called对象不是函数或函数指针double

请帮我解决一下。希望你最早回答。

谢谢

问候

拉梅什

2 个答案:

答案 0 :(得分:1)

除了重复使用您的函数和变量名I和'H'之外,您根本不应使用I作为您自己的标识符。

  

7.3复杂算术(complex.h)

     

7.3.1简介

     

...

     

I扩展为_Imaginary_I_Complex_I。如果未定义_Imaginary_II将扩展为_Complex_I

答案 1 :(得分:0)

你有一个函数和一个变量名I,所以编译器可能会在两者之间混淆。改为:

double I(double x)
{
    double gamma=0.182;
    double tau=0.41493;
    double om=7.1534;
    double Ival=(gamma*x)/(pow((pow(om,2)-pow(x,2)),2)*(1+pow((x*tau),2))+(2*gamma*x*((pow(om,2)-pow(x,2))*x*tau)+pow((gamma*x),2)));
    return Ival;
}