0

如果我将所有变量都保留为 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...

4

6 回答 6

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;

}
于 2012-10-23T04:11:22.880 回答
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 是双精度值,只是平均值,因此您应该只更改该变量的类型并将其与传递给函数的参数相匹配。

在进行除法之前,还需要将总数*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;
}
于 2012-10-23T04:10:22.430 回答
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

于 2012-10-23T04:17:31.393 回答
1

这里有一些非常错误的地方——您将xand定义average为 in 中的指针变量main,如果幸运的话,它的大小与 an 相同int,但可能会导致未定义的行为。

从和in*的局部变量声明中删除它,它实际上可能会起作用。xaveragemain

此外,在 中sommeTableau,除法 (*xtailleTableau) 的两个操作数都是int,因此执行整数除法并在分配给 之前丢弃余数*average

于 2012-10-23T04:04:14.253 回答
1
int *x = 0;
int *average = 0;

这是定义两个指针并将指针设置为零——在指针上下文中,这将转换为空指针。所以,你必须指向什么都没有。

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

在这里,您将这些指针的地址传递给函数,因此该函数实际上正在接收一个int **.

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

然后获取指针的值——它持有的地址——并(可能)将该位模式视为int. 这在技术上是未定义的行为,但在许多机器上,一个指针足以让它看起来像一个 int 工作。但是,浮点数几乎永远不会发生同样的情况。

您在这里要做的是定义两个ints(或两个doubles)并将它们的地址传递给您的函数:

double x=0.0, average=0.0;

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

// ...
printf("%f, %f\n", x, average);
于 2012-10-23T04:08:46.670 回答
1

它实际上不起作用。

在这里,您将x和定义averageNULL指向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并且您启用了警告,您也可以发现此类问题。

于 2012-10-23T04:09:34.550 回答