2013-12-15 275 views
2

好吧,我正在嘗試編寫一個程序,它使用Simpson的3/8規則對積分進行數值計算。我遇到了將Integral * newintegral的值傳遞給simpson()函數的問題。我對結構和指針的理解並不十分自信,我一直在回顧課堂筆記和整天在線檢查信息,但我仍然不明白爲什麼它不起作用。將結構(指向結構?的指針?)傳遞給函數

當我嘗試構建程序時,出現了一些錯誤,特別是:第46行「Integral之前的期望表達式」和大部分55-63「無效類型的參數」 - > '(有'積分')我不明白爲什麼第一個發生,因爲我的講師這種類型的事例的例子,當一個結構傳遞給一個函數只有語法func(Struct_define_name individual_struct_name)。我認爲這是我在做什麼與心靈(積分是結構類型的名稱,我是特定的結構),但顯然不是。

我認爲這兩個問題是相連的,所以我包含了所有我的代碼上下文,但行如上所述,實際上有錯誤的是46和55-63 bly首先定義了錯誤的結構或者其他東西。

(順便在辛普森的數學()函數實際上並沒有正常工作,現在是這樣,但是這不是我關心的)

而且我試着尋找其他類似的問題,但我沒有了解其他代碼正在做什麼,所以我無法推斷如何修復我的代碼。我知道這是不是給其他人非常相關的,但我真的不明白編程以及足夠的嘗試和短語我的問題在一般意義上...

'#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

typedef struct integral { 
    double result, limits[2]; 
    int degree; 
    double coefficients[]; 
} Integral; 

// Prototype of function that calculates integral using Simpson's 3/8 rule 
double simpson(Integral i); 


// function (?) which initialises structure 
Integral *newintegral() { 
    Integral *i = malloc(sizeof *i); 
    double lim1_in, lim2_in; 
    int degree_input, n; 

    printf("Please enter the degree of the polynomial.\n"); 
    scanf("%d", &degree_input); 
    i->degree = degree_input; 

    printf("Please enter the %d coefficients of the polynomial, starting\n" 
      "from the highest power term in the polynomial.\n", (i->degree+1)); 

     for (n=i->degree+1; n>0; n=n-1) { 
      scanf("%lg", &i->coefficients[n-1]); 
} 

    printf("Please enter the upper limit of the integral.\n"); 
    scanf("%lg", &lim1_in); 
    i->limits[0] = lim1_in; 

    printf("Please enter the lower limit of the integral.\n"); 
    scanf("%lg", &lim2_in); 
    i->limits[1] = lim2_in; 

    return i; 
} 


int main() { 
    Integral *i = newintegral(); 
    simpson(Integral i); 
    return 0; 
} 


double simpson(Integral i) { 
    int n; 
    double term1, term2, term3, term4; 

    for (n=(i->degree); n>0; n=n-1) { 
     term1=(pow(i->limits[1],n)*(i->coefficients[n]))+term1; 
     term2=(pow(((((2*(i->limits[1]))+(i->limits[0])))/3),n)*(i->coefficients[n]))+term2; 
     term3=(pow(((((2*(i->limits[0]))+(i->limits[1])))/3),n)*(i->coefficients[n]))+term3; 
     term4=(pow(i->limits[0],n)*(i->coefficients[n]))+term4; 
    } 
    i->result = (((i->limits[0])-(i->limits[1]))/8)*(term1+(3*term2)+(3*term3)+term4); 

    printf("The integral is %lg\n", i->result); 

    return 0; 
}' 

回答

1

您目前正在傳遞一個指針,接受一個Integral參數的函數。

原型,double simpson(Integral i);告訴編譯器「宣佈了一個名爲simpson函數返回一個double,並採取由函數內部的標識符i引用一個Integral

然而,在main()你說:

int main() { 
    //declare a pointer to an Integral and assign it to the return of 'i' 
    Integral *i = newintegral(); 
    //call the function simpson with i. 
    //However, you are redeclaring the type of the function argument, so the compiler will complain. 
    simpson(Integral i); 
    return 0; 
} 

您的電話simpson(Integral i);將不起作用,因爲您重新聲明瞭函數參數的類型。編譯器會註明:

:46:13: error: expected expression before ‘Integral’ 

你真正需要的是什麼simpson()採取指針積分作爲其參數。實際上,你已經在函數內部處理了這個(使用i->),但是你的函數原型告訴編譯器你正在傳遞整個struct Integral作爲函數參數。

解決方案:

改變你的函數原型如下:

double simpson(Integral *i); // function returning double taking single pointer to an Integral named i. 

...並改變main()看起來像如下:

int main(void) { //In C main has two valid definitions: 
       //int main(void), or int main(int argc, char **argv) 

    Integral *i = newintegral(); 
    simpson(i); 
    return 0; 
} 

所以在最後,你的理解指針是正確的,但不是如何將指針傳遞給函數。

**旁註: 請記住,始終在啓用所有警告的情況下構建代碼。編譯器會給你非常有用的診斷信息,這將有助於你快速找到解決這類問題的方法。對於海灣合作委員會,至少使用gcc -Wall myprogram.c

1

兩個顯而易見的問題: -

Line 46 : simpson(Integral i); 

...應該只是simpson(i);。把一個類型只是一個錯誤。

而這一點,後面:

double simpson(Integral i) 

..告訴編譯器在積分對象傳遞尚未使用間接運算符即i->limits好像你已經通過一個指針。最簡單的解決方法是使函數預期的指針,就像這樣:

double simpson(Integral *i)