为什么我的数组没有正确存储结构?

时间:2011-11-30 17:45:30

标签: c arrays struct ansi

我在应该非常简单的事情上遇到了一些麻烦。在我的程序中,我有一个名为“Run”的结构:

typedef struct{
    char name[MAXNAMELENGTH], day[MAXDAYLENGTH];
    int distance, intDay;
    Date startDate;
    Time startTime;
    Time runTime;
} Run;

我将文本文件中的数据解析为此结构,方法是使用fgets()将单行解析为名为line []的数组,然后调用此函数:

void parseTable(char line[NUMBEROFLINES], Run run, Run runs[NUMBEROFLINES], int *j){
    sscanf(line,"%s %s %s %d, %s %d:%d %d %d:%d:%d",run.name, run.day, run.startDate.month, &run.startDate.date, run.startDate.year,&run.startTime.hours, &run.startTime.minutes, &run.distance, &run.runTime.hours, &run.runTime.minutes, &run.runTime.seconds);
    runs[*j] = run;
    *j+=1;    
}

现在这个函数正确地将所有数据分配给struct run并将该struct存储在数组中运行[],但在此之后我希望为struct赋一个新值:intDay。 为此,我呼吁以下功能:

void dayToInt(Run run, Run runs[NUMBEROFLINES], int *i, int *a, int *b){
    if (strcmp(run.day,"Mon") == 0)
        run.intDay = 1;
    else if (strcmp(run.day,"Tue") == 0)
        run.intDay = 2;
    else if (strcmp(run.day,"Wed") == 0)
        run.intDay = 3;
    else if (strcmp(run.day,"Thu") == 0)
        run.intDay = 4;
    else if (strcmp(run.day,"Fri") == 0)
        run.intDay = 5;
    else if (strcmp(run.day,"Sat") == 0)
        run.intDay = 6;
    else if (strcmp(run.day,"Sun") == 0)
        run.intDay = 7;
    runs[*i] = run;
    *i += 1;
}

但是这并没有将intDay值存储在我的数组run []中,而且我真的不明白它为什么没有。我已经在这里和其他论坛上看到了如何做到这一点的示例,但必须有一些我一直缺少的东西,所以如果有人能告诉我它是什么,那么我将不胜感激:)

2 个答案:

答案 0 :(得分:2)

这里的问题是“传递价值”。

调用该函数时:     void dayToInt(运行运行,运行运行[NUMBEROFLINES],int * i,int * a,int * b){

第一个参数run实际上被复制到该函数的本地副本中。修改run.intDay时,它只会修改本地副本。

当您从函数返回时,所有本地修改都将丢失,并且调用者范围内的原始结构保持不变。

要解决此问题,请将该函数更改为“Pass-by-Reference”,这意味着,将指针传递给您想要更改的结构:

void dayToInt(Run *prun, Run runs[NUMBEROFLINES], int *i, int *a, int *b){
    if (strcmp(prun->day,"Mon") == 0)
        prun->intDay = 1;
    else if (strcmp(prun->day,"Tue") == 0)
        prun->intDay = 2;
[etc, etc]

修改在进一步检查时,它看起来像是行:

runs[*i] = run;

应该执行结构的副本,并保留调用者范围内的更改。 所以我不确定为什么run.intDay的更改会丢失。进一步调查。

答案 1 :(得分:0)

您的代码有效。

所以,要么你的麻烦在于你如何调用函数,或者你如何检查它是否有效(你是否检查了数组的正确元素,即i当前值之前的元素,返回刚刚增加?)