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になります... printf関数ですべてをdoubleに変更し、%dを%fに変更すると、ゼロになり、理由がわかりません...

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

x と average を null ポインターとして渡しています。あなたのコードがセグメンテーション違反を起こしているのはそのためです。

あなたの説明に従って、チェックしてください(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 に答える
2

あなたの問題の1つはここにあります:

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

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

最初の 2 行は次のようになります。

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、除算を行う前に合計を double にキャストする必要があります。これにより、整数除算を意味しないことがわかります。

これらの変更により、出力は次のように変更されます。

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 に答える
1

ここで何かがひどく間違っています。でポインタ変数としてxとを定義しています。運が良ければ と同じサイズですが、未定義の動作が発生する可能性があります。averagemainint

とin*のローカル変数宣言から を削除すると、実際に機能する可能性があります。xaveragemain

また、 では、除算 (および)sommeTableauの両方のオペランドがであるため、整数除算が実行され、剰余は に代入される前に破棄されます。*xtailleTableauint*average

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

これは、2 つのポインターを定義し、ポインターを 0に設定しています。これは、ポインター コンテキストでは null ポインターに変換されます。したがって、何もないポインタにする必要があります。

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

ここでは、これらのポインターのアドレスを関数に渡しているため、関数は実際にint **.

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

これは、ポインターの値 (ポインターが保持しているアドレス) を取得し、(おそらく) そのビット パターンをint. これは技術的には未定義の動作ですが、多くのマシンでは、ポインタは int のように機能しているように見えます。ただし、浮動小数点数では同じことはほとんどありません。

ここでやりたいことは、2 つint(または 2 つdouble) を定義し、それらのアドレスを関数に渡すことです。

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ここでは、とを へのポインタaverageとして定義します。NULLint

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 に答える