2011-11-30 74 views
1

我在应该很简单的事情上遇到了一些麻烦。在我的程序我有一个名为“运行”的结构:为什么我的数组不能正确存储结构?

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

我通过使用与fgets解析从文本文件中该结构数据()来解析在单个线到一个数组称为线[],然后调用该功能:

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

现在这个功能正常的所有数据分配给结构运行和存储阵列中运行结构[],但在这之后我想分配结构的新值: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值运行[],我真的不明白为什么它没有。我在这里看了看,在其他论坛上看到如何做到这一点的例子,但一定有什么东西我一直缺少的,因此,如果任何人都可以告诉我它是什么,然后将不胜感激:)

+0

你是如何调用'dayToInt'? –

回答

2

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

当调用函数: 空隙dayToInt(运行运行,运行运行[NUMBEROFLINES],INT * 1,INT *一个,INT * B){

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

当你从函数返回,所有的本地修改都将丢失,原来的结构,在调用者的范围,保持不变。

要解决该问题,改变功能,以“传址参考”,这意味着,将指针传递到结构要发生变化:

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的更改丢失。进一步调查。

+0

我看到@GWW也提供了相同的答案,然后将其删除。我很想知道为什么? – abelenky

+0

非常感谢:)但是当我呼吁函数dayToInt像这样: dayToInt(运行[I],运行,和我,和一,和b) 我得到“错误:不兼容的类型为‘dayToInt’的参数1”任何想法为什么? – Saaru

+0

正确的调用将是dayToInt(&runs [i],运行......)(取第一个参数的ADDRESS)。看到我的**编辑**:我不确定这会解决您的问题,我仍然不确定发生了什么。 – abelenky

0

你的代码工作。

所以,无论你的麻烦在于你如何调用函数,或者你如何检查它的工作原理(你检查数组的正确元素,即在当前值i之前的那个元素,刚会增加吗?)

+0

我调用该函数并从结构体中打印intDay,如下所示: 'while while(i Saaru

+0

@Saaru:所以你总是打印相同的'run'。 – ninjalj

+0

尝试'printf(“%d”,运行[i-1] .intDay);' – ninjalj

相关问题