Когда вы передаете массивы, вы просто цитируете имена на вызывающем сайте:
numGames = getStats(date[][2], oppName[], inStats[][4]);
numGames = getStats(date, oppName, inStats);
Именно в вызываемых функциях вы используете (более или менее) обозначение, которое вы показали.
Однако, когда ваша функция принимает многомерный массив, вы должны указать размерывторое и последующие измерения в списке аргументов функции.
double compAvgTD(stat[][], numGames)
double compAvgTD(double stat[][4], int numGames)
Это применимо как в объявлениях внутри main()
и в определениях функций.Обратите внимание, что я также добавил типы.
Как отметил другой автор, условно (хотя на самом деле это не так) объявлять функции внутри main()
.Если объявленные функции будут вызываться из любой другой функции, тогда было бы плохо объявлять функции внутри main()
- вам пришлось бы повторяться, чтобы объявить функции в других функциях, из которых они вызваны, в противоречие сAgile dictum: DRY Не повторяйте себя.
Компилирующее решение "I'm A Gullible Mug"
Было много изменений, необходимых для получениякод для компиляции.Код не был выполнен.
Здесь есть хотя бы одна ошибка - функция compAvgPts()
использует ту же статистику, что и cmpAvgYds()
, которая, вероятно, даст завышенную статистику по точкам.Исправление, которое требует умеренно серьезной операции;Я думаю, что вы пропустили два столбца данных во входных данных (оценка для каждой команды).
Однако код компилируется чисто на MacOS X 10.6.5 с использованием GCC 4.2.1 с командной строкой:
gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition xx.c -o xx
Обратите внимание, что мне пришлось переместить объявления функций из main()
;в противном случае компилятор предупредил, что в области действия не было прототипа.
#include <stdio.h>
#include <math.h>
#define MAXGAMES 15
#define AUSTATS "auPass2010.txt"
int getStats(int date[][2], char oppName[][64], double inStats[][4]);
void analysis(double inStats[][4], double outStats[][3], int numGames);
double compAvgCmp(double stat[][4], int numGames);
double compAvgAtt(double stat[][4], int numGames);
double compAvgYds(double stat[][4], int numGames);
double compAvgTD(double stat[][4], int numGames);
double compAvgPts(double stat[][4], int numGames);
int main(void)
{
int date[MAXGAMES][2];
char oppName[MAXGAMES][64];
double inStats[MAXGAMES][4];
double outStats[MAXGAMES][3];
double avgCmp, avgAtt, avgYds, avgTD, avgPts;
int numGames=0, r,c;
numGames = getStats(date, oppName, inStats);
printf("\t\t2010 AUBURN PASSING STATISTICS\n"
"DATE\tOPPONENT\t\tCMP\tATT\tYDS\tTD --\tAVEYDS\t%%CMP\tPTS\n"
"-----\t-------------\t----\t----\t----\n");
if (numGames <= 0)
printf("%s NO GAMES READ\n", AUSTATS);
else
{
analysis(inStats, outStats, numGames);
printf("%d\n", numGames);
for (r=0;r<numGames;r++)
{
for (c=0;c<=4;c++)
{
printf("%2d/%2d\t%s\t\t%5.0f\t%5.0f\t%5.0f\t%5.0f\t \t%6.1lf\t%6.1lf\t%5.0lf\n",
date[r][0], date[r][1], &oppName[r][0], inStats[r][0], inStats[r][1],
inStats[r][2], inStats[r][3], outStats[r][0], outStats[r][1], outStats[r][2]);
}
}
avgCmp = compAvgCmp(inStats, numGames);
avgAtt = compAvgAtt(inStats, numGames);
avgYds = compAvgYds(inStats, numGames);
avgTD = compAvgTD(inStats, numGames);
avgPts = compAvgPts(inStats, numGames);
printf("-----\t------------------\t----\t----\t-----\t---\t\t\t----\n");
printf("Season Averages\t\t\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t\t\t%3.1f\n", avgCmp, avgAtt, avgYds, avgTD, avgPts);
}
return 0;
}
int getStats(int date[][2], char oppName[][64], double inStats[][4])
{
FILE *infile;
int n=0;
infile = fopen(AUSTATS, "r");
if (infile == NULL)
printf("%s FILE OPEN ERROR\n", AUSTATS);
else
{
while (fscanf(infile, "%d %d %63s %lf %lf %lf %lf",
&date[n][0], &date[n][1], oppName[n], &inStats[n][0], &inStats[n][1],
&inStats[n][2], &inStats[n][3]) == 7)
n++;
fclose(infile);
}
return n;
}
void analysis(double inStats[][4], double outStats[][3], int numGames)
{
int n;
for (n=0;n<numGames;n++)
{
outStats[n][0] = inStats[n][2] / inStats[n][0];
outStats[n][1] = inStats[n][0] / inStats[n][1] * 100;
outStats[n][2] = inStats[n][3] * 6;
}
}
double compAvgCmp(double stat[][4], int numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][0];
}
return sum / numGames;
}
double compAvgAtt(double stat[][4], int numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][1];
}
return sum / numGames;
}
double compAvgYds(double stat[][4], int numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][2];
}
return sum / numGames;
}
double compAvgTD(double stat[][4], int numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][3];
}
return sum / numGames;
}
double compAvgPts(double stat[][4], int numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][2];
}
return sum / numGames;
}