Reputation: 71
So, this program is supposed to take stats from Auburn's football season and compute averages for each game and the whole season and print them on the screen in a chart. I thought I had figured this out, but I keep getting errors while trying to compile. I'm sure I'm missing some other stuff too, but I should figure that out once I get the program to compile and give me results. I would probably know what was going on if my teacher decided to teach the class. Any help would be greatly appreciated.
Here are some of the errors I'm getting:
error: expected ')' before '[' token - this shows up on all of my compAvg functions.
error: expected expression before ']' token - this one shows up at the numGames=getStats line.
error: too few arguments to function 'analysis'
error: 'numGames' undeclared here (not in a function) - this appears at the void analysis function and I'm guessing it has to do with the last error.
error: subscripted value is neither array nor pointer - this is coming up on my first second printf line
#include <stdio.h>
#include <math.h>
#define MAXGAMES 15
#define AUSTATS "auPass2010.txt"
int main() //main function
{
double date[MAXGAMES][2], oppName[MAXGAMES], inStats[MAXGAMES][4], outStats[MAXGAMES][3]; //declare variables
double avgCmp, avgAtt, avgYds, avgTD, avgPts;
int numGames=0, n=0,r,c;
int getStats(int date[][2], char oppName[], double inStats[][4]);//prototypes
void analysis( double inStats[][4], double outStats[][3], double numGames);
double compAvgCmp(stat[][], numGames);
double compAvgAtt(stat[][], numGames);
double compAvgYds(stat[][], numGames);
double compAvgTD(stat[][], numGames);
double compAvgPts(stat[][], numGames);
numGames = getStats(date[][2], oppName[], inStats[][4]);
printf("\t\t2010 AUBURN PASSING STATISTICS\nDATE\tOPPONENT\t\tCMP\tATT\tYDS\tTD --\tAVEYDS\t%CMP\tPTS\n-----\t-------------\t----\t----\t----\t"); //prints header
if(numGames <= 0) printf("%s NO GAMES READ\n", AUSTATS);
else
{
analysis(double inStats[][4], double outStats[][3], double 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.0d\t%5.0d\t%5.0d\t%5.0d\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][4], numGames);
avgAtt = compAvgCmp(inStats[numGames][4], numGames);
avgYds = compAvgCmp(inStats[numGames][4], numGames);
avgTD = compAvgCmp(inStats[numGames][4], numGames);
avgPts = compAvgCmp(outStats[numGames][4], 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\t3.1f\n", avgCmp, avgAtt, avgYds, avgTD, avgPts);
return 0;
}
int getStats(int date[][2], char oppName[], double inStats[][4])
{
FILE *infile;
int n=0;
infile = fopen(AUSTATS, "r");
if(infile == NULL) printf("%s FILE OPEN ERROR\n");
while(fscanf(infile, "%d %d %s %lf %lf %lf %lf",
date[n][0], date[n][1], oppName[n], inStats[n][0], inStats[n][1], inStats[n][2], inStats[n][3]) !=EOF) n++;
return n;
}
void analysis(double inStats[numGames][4], double outStats[numGames][3], double 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(stat[][], numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][0]
}
return sum / numGames;
}
double compAvgAtt(stat[][], numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][1]
}
return sum / numGames;
}
double compAvgYds(stat[][], numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][2]
}
return sum / numGames;
}
double compAvgTD(stat[][], numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][3]
}
return sum / numGames;
}
double compAvgPts(stat[][], numGames)
{
int n;
double sum=0;
for (n=0;n<=numGames;n++)
{
sum += stat[n][2]
}
return sum / numGames;
}
Upvotes: 3
Views: 359
Reputation: 24895
A quick glance answer: Why do you want to declare the functions inside the main function? Declare them above the main function.
Also, I think all your function calls are incorrect. Most of your functions expect arrays, but the way you are passing them are incorrect.
For Ex:
when you call the function
int getStats(int date[][2], char oppName[], double inStats[][4]);
You must do it like:
getStats(date, oppName, inStats)
EDIT: As correctly mentioned by Jonathan Leffer, for multi-dimensional arrays, second and subsequent dimensions must be passed.
Check the below links. These might help:
http://bytes.com/topic/c/insights/772412-arrays-revealed
http://cboard.cprogramming.com/c-programming/97898-passing-2-dimensional-array-function.html
Upvotes: 0
Reputation: 753495
When you're passing the arrays, you just cite the names at the calling site:
numGames = getStats(date[][2], oppName[], inStats[][4]);
numGames = getStats(date, oppName, inStats);
It is in the called functions that you use (more or less) the notation you showed.
However, when your function accepts a multi-dimensional array, you must specify the sizes of the second and subsequent dimensions in the function's argument list.
double compAvgTD(stat[][], numGames)
double compAvgTD(double stat[][4], int numGames)
This applies both in the declarations inside main()
and in the definitions of the functions. Note that I added the types, too.
As another answerer pointed out, it is aconventional (though not actually wrong) to declare the functions inside main()
. If the declared functions would be called from any other function, then it would be bad to declare the functions inside main()
- you'd have to repeat yourself to declare the functions in the other functions from which they are called, in contradiction of the Agile dictum: DRY Don't Repeat Yourself.
There were many changes necessary to get the code to compile. The code has not been run.
There is at least one bug left in here - the compAvgPts()
function uses the same statistic as cmpAvgYds()
which is likely to give inflated statistics on the points. Fixing that requires moderately major surgery; I think you're missing two columns of data in the input (the score for each team).
However, the code does compile cleanly on MacOS X 10.6.5 using GCC 4.2.1 with the command line:
gcc -O -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition xx.c -o xx
Note that I had to move the function declarations out of main()
; otherwise, the compiler warned that there was no prototype in scope.
#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;
}
Upvotes: 5