0

関数の呼び出し方に本当に戸惑っています。1つ以上の回答に応じて更新されたコード。現在のコードとビルドエラーは以下のとおりです。

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

//function prototypes
void signs(int x[], int size, int *negPtr, int *zeroPtr, int *posPtr);
double average(int x[], int size, int *greaterPtr);

int main()
{
//variable declarations
int zeroCounter, posCounter, negCounter, greaterThanAveCounter;
double ave;
int i;
int arr[63];
int size = 63;
int x[63], int size, int* negPtr, int* zeroPtr, int* posPtr, int* greaterPtr;

//seeding the random number generator function with the time
srand(time(NULL));

//filling the array with random numbers from the interval [-15, 40]
for(i=0; i<63; i++)
{
    arr[i] = rand()%(40-(-15)+1)+(-15);
}

//printing the array to the screen 9 elements per line
for(i=0; i<63; i++)
{
    if(i%9==0)
    {
        printf("\n");
    }
    printf("%5d",arr[i]);
}

//call function signs
signs (x, size, negPtr, zeroPtr, posPtr);

printf("\n\nThe number of elements that are negative is: %d\n",negCounter);
printf("The number of elements that are equal to zero is: %d\n",zeroCounter);
printf("The number of elements that are positive is: %d\n",posCounter);


//call function average
average(x, size, greaterPtr);

printf("The average of all the elements is: %.2f\n",ave);
printf("The number of elements that are greater than the average is: %d\n",greaterThanAveCounter);

return 0;
}



/***************************************************************************
signs:
This function finds the number of elements that are negative, positive and
equal to zero in an integer array. The number of elements that are negative,
positive and equal to zero are returned by 3 pointers that the function
receives.

Inputs
1. The integer array
2. The size of the aray
3. An integer pointer to the negative counter
4. An integer pointer to the zero counter
5. An integer pointer to the positive counter
***************************************************************************/
void signs(int x[], int size, int *negPtr, int *zeroPtr, int *posPtr)
{
int i;
for (i=0; i<size; i++)
{
    if(x[i]<0)
    {
        (*negPtr)++;
    }
    else if (x[i]==0)
    {
        (*zeroPtr)++;
    }
    else
    {
        (*posPtr)++;
    }
}
}



/***************************************************************************
average:
This function finds the average and the number of elements that are greater
than the average in an integer array. The function returns the value of the
average and returns the number of elements that are greater than the average
using a pointer that the function should receive.

Inputs
1. The integer array
2. The size of the aray
3. An integer pointer to the greater than average counter
***************************************************************************/
double average(int x[], int size, int *greaterPtr)
{
int i;
double ave;
int sum=0;

for (i=0; i<size; i++)
{
    sum+=x[i];
}

ave = (double)sum/size;

*greaterPtr = 0;
for (i=0; i<size; i++)
{
    if(x[i]>ave)
    {
        (*greaterPtr)++;
    }
}
return ave;
}

新しいエラー

  • (32):エラーC2059:構文エラー:'type'
  • (35):警告C4244:'関数':'time_t'から'unsigned int'への変換、データの損失の可能性
  • (54):エラーC2065:'negPtr':宣言されていない識別子

  • (54):警告C4047:'function':'int *'は、
    'int'とは間接レベルが異なります

  • (54):警告C4024:'記号':正式なパラメーターと実際のパラメーターの異なるタイプ3
  • (54):エラーC2065:'zeroPtr':宣言されていない識別子
  • (54):警告C4047:'function':'int *'は、'int'とは間接レベルが異なります

  • (54):警告C4024:'記号':正式なパラメーターと実際のパラメーターの異なるタイプ4

  • (54):エラーC2065:'posPtr':宣言されていない識別子
  • (54):警告C4047:'function':'int *'は、'int'とは間接レベルが異なります

  • (54):警告C4024:'記号':正式なパラメーターと実際のパラメーターの異なるタイプ5

  • (62):エラーC2065:'greaterPtr':宣言されていない識別子

  • (62):警告C4047:'function':'int *'は、
    'int'とは間接レベルが異なります

  • (62):警告C4024:'平均':正式なパラメーターと実際のパラメーターの異なるタイプ3
  • 1>1>ビルドに失敗しました。
4

3 に答える 3

2
double average(int x[], int size, int *greaterPtr);

関数を宣言する方法です。それを呼び出すには、次のようなものが必要です。

int a[10], b, *c;             // should also set these to sensible values.
double d = average (a, b, c);

新しく追加されたエラーメッセージに関して、私はいくつかの手助けをします:

int x[63], int size, int* negPtr, int* zeroPtr, int* posPtr, int* greaterPtr;

これは、複数の変数を定義する方法ではなく、次のようになります。

int x[63], size, *negPtr, *zeroPtr, *posPtr, *greaterPtr;

これが、現在の問題のほとんどの唯一の原因である可能性があります(これは確認していませんが、簡単な分析によるものです)。

于 2012-12-11T04:26:34.483 に答える
1

signs (x, size, negPtr, zeroPtr, posPtr);関数を呼び出す正しい方法です。未定義のエラーが発生する理由は、main関数でこれらの変数を宣言しないため、次のようなものが必要になるためです。

int x[];
int size;
int* negPtr;

于 2012-12-11T04:28:37.497 に答える
0
  • (32):エラーC2059:構文エラー:'type'

変数が間違っていると宣言しています。この行は次のようになります。

int x[63], size, *negPtr, *zeroPtr, *posPtr, *greaterPtr;

ただし、1行に1つの変数宣言を保持することをお勧めします。これにより、この種のエラーが回避され、コードが少し読みやすくなるためです。

  • (35):警告C4244:'関数':'time_t'から'unsigned int'への変換、データの損失の可能性

time()を返し、time_tsrand()取りますunsigned int。の戻り値を明示的にキャストして、time()これが発生することを予期していることをコンパイラーに通知する必要があります。

srand((unsigned int)time(NULL));

残りの警告は、最初のエラーによるノックオン効果のようです。

于 2012-12-11T11:43:48.287 に答える