2014-05-25 60 views
-6

的邊緣,我有以下結構結構在C越來越成問題,在不正確的結果

struct statistics { 
    int result[100],steps[100],gamecounter; 
    float time[100]; 
}; 
typedef struct statistics GAMEST; 

在我的功能,我這樣稱呼它

GAMEST gamesStruct; 
gamesStruct.result[2]=res; 
gamesStruct.steps[2]=step; 
gamesStruct.time[2]=tim; 

在我值分配給該結構的那一刻它的一切都很好,數據也很好。但是,當我嘗試打印我以前分配例如值gamesStruct.result [0]我所得到 是一個很大的數字,它看起來像一樣,如果gamesStruct.result [0]是空的內存地址。

任何想法?

下面是一些更多的代碼

int stats(int res,int gamenum,int step,float tim,int counter){ 
GAMEST gamesStruct; 
char vic[3][7]; 
if(gamenum>=0){ 
    strcpy(vic[0],"Draw"); 
    strcpy(vic[1],"Victory"); 
    strcpy(vic[2],"Loss"); 
    gamesStruct.result[gamenum]=res; 
    gamesStruct.steps[gamenum]=step; 
    gamesStruct.time[gamenum]=tim; 
}else{ 
    printf("Stats per game :\n\n"); 
    system("pause"); 
    for(int i=0;i<=counter;i++){ 
     int tmp=gamesStruct.result[0]; 
     printf("%d",gamesStruct.result[0]); 
    system("pause"); 
    system("pause"); 
     printf("Game %d : %s in %d moves and %f seconds\n\n",i+1,vic[tmp],gamesStruct.steps[i],gamesStruct.time[i]); 
    } 
    printf("out"); 
    system("pause"); 
    int ressum[3]={0,0,0}; 
    int stepsum=0; 
    int timesum=0; 
    printf("2"); 
    system("pause"); 
    for(int i=0;i<=counter;i++){ 
     ressum[gamesStruct.result[i]]=ressum[gamesStruct.result[i]]+gamesStruct.result[i]; 
     stepsum=stepsum+gamesStruct.steps[i]; 
     timesum=timesum+gamesStruct.time[i]; 
    } 
    float resmid[3],stepmid,timemid; 
    resmid[0]=resmid[0]/(counter+1); 
    resmid[1]=resmid[1]/(counter+1); 
    resmid[2]=resmid[2]/(counter+1); 
    stepmid=stepmid/(counter+1); 
    timemid=timemid/(counter+1); 
    printf("\n\nAverage stats for %d games:\n\n",counter+1); 
    printf("\nVictories :%f Losses :%f Draws :%f \n",resmid[1],resmid[2],resmid[0]); 
    printf("\nAverage moves :%f and Time :%f\n\n",stepmid,timemid); 
} 


return(0); 

}

如果gamenum較大或等於0,我的正常工作的struct賦值。 但是當我試圖把它們打印我的程序崩潰,因爲數據是錯誤的

我想指出,之前,我嘗試訪問他們,我已經賦值,那是我的問題

+0

[學會如何提問](http://stackoverflow.com/help/how-to-問)[發佈最小,完整有效的實施例]的(http://stackoverflow.com/help/mcve) – Rakib

+2

可能重複:。http://stackoverflow.com/questions/1597405/what-happens-to-一個聲明的,未初始化的變量,在-C-做,它具備的,一個價值 – vines

+0

@vines我的問題是,我在位置0分配一個值,當我在數組的下一個位置分配以前是走了我的問題不是關於空變量是關於變量不保持其值 – mremremre1

回答

1

從您的代碼 - 假設函數stats正在執行一個遊戲迭代。 gamesStruct局部變量在stats結束時被銷燬,並被一次又一次地聲明(並初始化)。

這就是爲什麼前面的結果將被清除。

你應該聲明gamesStruct在調用API並通過引用stats方法傳遞它。

int stats(GAMEST& gamesStruct, int res,int gamenum,int step,float tim,int counter) 
{ 
    ... // same as before 
} 

(注意調用迭代之前創建gamesStruct妥善銷燬它,如果動態分配。

+0

你的意思是我應該通過它作爲統計功能的參數?該結構被許多其他函數調用,我應該聲明它是全局的嗎? – mremremre1

+0

是的,沒錯 - 如果你宣佈它在本地的方法,它的內存被在 – NirMH

+0

我想要的結構來保持數據,只要在程序運行方法結束返回到操作系統。我應該將它聲明爲extern還是內部主? – mremremre1