开发者

2-d Arrays in C

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开发者_Go百科[][], 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;
}


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.


The "I'm A Gullible Mug" Compiling Solution

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;
}


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜