如果我将所有变量保留为int我得到32.该除法应该给我32.5所以我认为将所有内容改为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 ...现在,如果我在printf函数中将所有内容更改为double并将%d更改为%f,则它给出零并且我不明白为什么...
答案 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;
}
答案 1 :(得分: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是double,只需要平均值,因此您应该只更改该变量的类型并将其与传递给函数的参数相匹配。
在进行除法之前,还需要将总*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;
}
答案 2 :(得分:2)
您将x和average作为空指针传递。这就是你的代码给出分段错误的原因。
根据您的描述,请查看(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
答案 3 :(得分:1)
这里有些严重错误 - 您将x
和average
定义为main
中的指针变量,如果您幸运的话,其大小与{{1}相同},但可能导致未定义的行为。
从int
中的*
和x
的本地变量声明中删除average
,它实际上可以正常工作。
此外,在main
中,除法(sommeTableau
和*x
)的两个操作数均为tailleTableau
,因此执行整数除法,并在赋值之前丢弃余数int
。
答案 4 :(得分: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);
答案 5 :(得分:1)
它实际上不起作用。
在此,您将x
和average
定义为NULL
的{{1}}指针:
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
1}}。上述修正解决了这个问题。如果你对某些参数的类型撒谎printf()
,任何事情都可能发生。如果您的编译器是gcc
并且启用了警告,那么您也可以发现这类问题。