2011-11-30 73 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

相關問題