2012-10-23 117 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