2017-06-21 9 views
-2

gslライブラリを使用して複雑な関数をCプログラミング言語で統合しています。このコードでは、私が成功したポインタを使って2つの変数を宣言しなければなりませんでした。しかし、私は主な機能でこれらの変数を渡すときに問題に直面しています。警告:互換性のないポインタ型からの代入[-Wincompatible-pointer-types] qt1.function =&H1

私を助けてください。

私のコードはここに書かれている

:上記のコードで

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.によって4つのファイルを持っていましたH1とHは2つのユーザ定義関数を含み、strは構造体のためのファイルであり、code.cはコンパイルするためのメインです。

あなたの時間と観測に感謝します。

よろしく

ラメシュ

+0

あなたは警告を表示していません。 –

+1

'gsl_function'と' H1'の型は何ですか?定義を教えてください。 –

+0

void *へのポインタをvoid *にキャストするのはなぜですか? – Aconcagua

答えて

1

フィールドqt1.functiondouble (*)(double, void *)型を持ちます。このフィールドに割り当てようとしている関数H1は、タイプstruct har (*)(void *, float, int)です。

これらの型は、引数の数、引数の型、および戻り型がすべて異なるため、互換性がありません。現時点では、決して使用されないpqという2つのパラメータがあります。また、返り値として構築するstruct harは、最初のフィールドだけをすべて設定しないので、構造体を返すのはなぜですか?

gsl_functionを操作するH1ためには、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 = & p_paramsを。

p_paramsstruct har *なので、そのアドレスはstruct har **です。あなたの関数は、しかし、中に渡されるstruct har *を期待しているので、これはそれを指すポインタのアドレス、構造体のアドレスにありません変更します。

qt1.params = &item; 

あなたがqt.paramsを設定するときにも不一致があります。あなたはそれにfloat *を与えていますが、あなたの関数Hdouble *と期待しています。 tのタイプを次のように変更してください:

double t = 4.14937*(m-1); 
+0

gsl paramsポインタ(gsl_integration.hファイル内)は、一度に "t"または "k"のいずれかのメンバーにしかアクセスできないため、私のコードで構造体を宣言する必要があります。そのため、私はstruct har型を使用しています。H1では、別のエラーを表示しています(戻り値の型は 'double'ですが、 'struct har'が必要です)。だから私はどのようにこれらのデータ型を宣言する必要がありますPLZ助けてください。あなたの貴重な時間と観測に感謝します。 –

+0

@RameshKumar私の編集を参照してください。関数ポインタに合わせるために 'H1'を変更する必要があります。 – dbush

+0

ありがとうございました。先生、私のコードはうまく動いています。 –