2012-10-23 114 views
0

如果我將所有變量保留爲int,則我得到32分。該分區應該給我32.5,所以我認爲將所有內容更改爲double將會執行此操作,但它只是讓我爲零。 ..將int更改爲double將我的結果更改爲零

這裏是代碼(INT一切):

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

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average); 

int main(int argc, char *argv[]) 
{ 
    int tableau[4] = {30, 50, 50}; 
    int *x = 0; 
    int *average = 0; 
    const int tailleTab = 4; 

    sommeTableau(tableau, tailleTab, &x, &average); 

    printf("The average is %d\n", average); 

    return 0; 
} 

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average) 
{ 
    int i = 0; 

    for (i = 0 ; i < tailleTableau ; i++) 
    { 
    *x = *x + tableau[i]; 
    } 
    *average = *x/tailleTableau; 

} 

所以此工程,並給了我32 ......現在,如果我改變一切將翻一番,%d到%F在printf函數,它給我零,我不明白爲什麼...

+2

無需做任何事情,但'average'雙,除了鑄造無論是股息或除數。 – chris

+0

你沒有從你的編譯器使用這段代碼得到任何警告? – Naytzyrhc

+0

不,我沒有得到任何警告..我應該嗎? –

回答

3

你的代碼有很多錯誤。我糾正了所有人

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

void sommeTableau(int tableau[], int tailleTableau, int *x, double *average); 

int main(int argc, char *argv[]) 
{ 
    int tableau[4] = {30, 50, 50}; 
    int x = 0; 
    double average = 0; 
    const int tailleTab = 4; 

    sommeTableau(tableau, tailleTab, &x, &average); 

    printf("The average is %lf\n", average); 

    return 0; 
} 

void sommeTableau(int tableau[], int tailleTableau, int *x, double *average) 
{ 
    int i = 0; 

    for (i = 0 ; i < tailleTableau ; i++) 
    { 
    *x = *x + tableau[i]; 
    } 
    *average = (double)(*x)/(double)tailleTableau; 

} 
+0

Thx !!!我剛學,所以我必然要犯錯誤嘿嘿 –

+0

學習好!..請注意,我在你的代碼所做的更改......也看了答案張貼others..Good運氣 –

+1

THX的所有立場!我很感激幫助 –

1

這裏有什麼是非常錯誤的 - 你是德罰款xaverage作爲main中的指針變量,如果您幸運的話,它的大小與int相同,但可能會導致未定義的行爲。

取下的mainxaverage局部變量聲明*,它可能實際工作。

另外,在sommeTableau,分裂(*xtailleTableau)的兩個操作數都int,從而執行整數除法和之前分配到*average其餘丟棄。

+0

我只是改變平均提高一倍,並把LF%在printf函數的答案,這仍然給了我一個零。 –

+0

@TimurRidjanovic沒關係,那是沒有問題的,這是x'和'average'的'的聲明。 –

+0

好吧,我這樣做,它給了我32.0000。如何來我沒有得到32.5? –

1
int *x = 0; 
int *average = 0; 

這被限定兩個指針和設置指針到零 - 其中在指示器上下文轉換爲空指針。所以,你不得不指向任何東西。

sommeTableau(tableau, tailleTab, &x, &average); 

在這裏,你傳遞的地址的指針功能,所以該功能確實接收int **

printf("The average is %d\n", average); 

這然後取指針的值 - 的地址其保持 - 和(可能)處理該比特圖案作爲int。這在技術上是未定義的行爲,但在許多機器上,它的指針足夠像int,因此它似乎可以工作。儘管如此,幾乎從來沒有是真實的浮點數。

你想在這裏做的是定義兩個int S(或兩個double S),並通過他們的地址給你的函數:

double x=0.0, average=0.0; 

sommeTableau(tableau, tailleTab, &x, &average); 

// ... 
printf("%f, %f\n", x, average); 
1

它不實際工作。

在這裏定義xaverage作爲NULL指針int

int *x = 0; 
int *average = 0; 

在這裏,而不是指針到int傳遞指針的指針到int

sommeTableau(tableau, tailleTab, &x, &average); 

這顯然是錯誤的。您應該啓用編譯器警告來查看這些有問題的地方並進行更正。

這裏的修正將是:

int x = 0; 
int average = 0; 

現在,這裏:

printf("The average is %d\n", average); 

你在撒謊,以printf()你打算給它什麼(一int,因爲%d) ,但你實際上給它一個指向int的指針。上述修正解決了這個問題。如果您對printf()說謊某些參數的類型,可能會發生任何事情。如果你的編譯器是gcc並且你啓用了警告,你也可以發現這類問題。

2

你的一個問題就出在這裏:

int *x = 0; 
int *average = 0; 

sommeTableau(tableau, tailleTab, &x, &average); 

這些前兩行應該是:

int x = 0; 
int average = 0; 

這是你應該得到的警告顯然,假設你使用一個體面編譯:

qq.c: In function ‘main’: 
qq.c:13: warning: passing argument 3 of ‘sommeTableau’ from incompatible pointer type 
qq.c:4: note: expected ‘int *’ but argument is of type ‘int **’ 
qq.c:13: warning: passing argument 4 of ‘sommeTableau’ from incompatible pointer type 
qq.c:4: note: expected ‘int *’ but argument is of type ‘int **’ 

此外,你不需要_everything是一個雙,只是AVER年齡,因此您應該只更改該變量的類型,並將其與傳遞給該函數的參數進行匹配。

在進行分割之前,還需要將總數*x加倍,以便它知道你不是指整數除法。

這些變化,從輸出的變化:

The average is 4.000000 

(對我來說),以正確的:

The average is 32.500000 

請參見下面的程序更多細節:

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

void sommeTableau(int tableau[], int tailleTableau, int *x, double *average) { 
    int i; 
    for (i = 0 ; i < tailleTableau ; i++) 
     *x = *x + tableau[i]; 
    *average = ((double)(*x))/tailleTableau; 
} 

int main (void) { 
    int tableau[4] = {30, 50, 50}; 
    int x = 0; 
    double average = 0; 
    const int tailleTab = 4; 

    sommeTableau(tableau, tailleTab, &x, &average); 
    printf("The average is %lf\n", average); 

    return 0; 
} 
+0

謝謝,它的工作!不知道我理解爲什麼儘管 –

+0

酷THX!我現在知道了! –

2

您正在傳遞x和平均值作爲空指針。這就是爲什麼你的代碼給分段錯誤。

根據你的描述,請檢查(http://codepad.org/z8fVUTe5)。

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

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average); 

int main(int argc, char *argv[]) 
{ 
    int tableau[4] = {30, 50, 50}; 
    int x = 0; 
    int average = 0; 
    const int tailleTab = 4; 

    sommeTableau(tableau, tailleTab, &x, &average); 

    printf("The average is %d\n", average); 

    return 0; 
} 

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average) 
{ 
    int i = 0; 

    for (i = 0 ; i < tailleTableau ; i++) 
    { 
    *x = *x + tableau[i]; 
    } 
    *average = *x/tailleTableau; 

} 

輸出: -

平均爲32