我在应该非常简单的事情上遇到了一些麻烦。在我的程序中,我有一个名为“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 []中,而且我真的不明白它为什么没有。我已经在这里和其他论坛上看到了如何做到这一点的示例,但必须有一些我一直缺少的东西,所以如果有人能告诉我它是什么,那么我将不胜感激:)
答案 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
当前值之前的元素,返回刚刚增加?)