2013-05-11 33 views
0

我的程序需要從輸入文件讀取值(整數和浮點數)。一行中有許多值,由製表符分隔,並且文件中有很多行。我已經計劃逐行讀取整個文件,解析每行並將整個內容存儲到由二維靜態數組組成的結構中。然後,當整個東西存儲在內存中時,我會進行計算,將結果填充到另一個結構中,最後將該結構的內容轉儲到輸出文件中。當然,它不起作用,當試圖運行程序時出現分段錯誤錯誤。包含數組結構的分段錯誤

這是我的定義輸入結構:

#define sim_spectrum_constant 122 
#define real_spectrum_constant 181 
#define num_days 365 

    struct spectrum { 
    int year[sim_spectrum_constant][num_days]; 
    int month[sim_spectrum_constant][num_days]; 
    int day[sim_spectrum_constant][num_days]; 
    int hour[sim_spectrum_constant][num_days]; 
    int minute[sim_spectrum_constant][num_days]; 
    int second[sim_spectrum_constant][num_days]; 
    float wavelength[sim_spectrum_constant][num_days]; 
    float irr_total[sim_spectrum_constant][num_days]; 
    float irr_direct[sim_spectrum_constant][num_days]; 
    float irr_diffuse[sim_spectrum_constant][num_days]; 
    }; 

    struct spectrum pS; 

這是我的初始化數組:

// initialization 
    for (i=0; i<sim_spectrum_constant; i++) { 
    for (j=0; j<num_days; i++) { 
     pS.year[i][j] = 0; 
     pS.month[i][j] = 0; 
     pS.day[i][j] = 0; 
     pS.hour[i][j] = 0; 
     pS.minute[i][j] = 0; 
     pS.second[i][j] = 0; 
     pS.wavelength[i][j] = 0.; 
     pS.irr_total[i][j] = 0.; 
     pS.irr_direct[i][j] = 0.; 
     pS.irr_diffuse[i][j] = 0.; 
    } 
    } 

這是我在從輸入文件中的值如何讀:

// determining how many simulated spectrums are provided in the file + reading spectrums into the array 
    row = 0; 
    n = 0; 
    if (fgets(line, sizeof(line), pInput_spektrum) == NULL) { 
    printf ("****Simulated spectrum doesn't contain any entries!! -- %s\nPress <enter> to exit...\n", strerror(errno)); 
    getchar(); 
    exit(-1); 
    } 

    while(fgets(line, sizeof(line), pInput_spektrum) != NULL) { 
    result=sscanf(line, "%i %i %i %i %i %i %f %f %f %f", pS.year[row][n], pS.month[row][n], pS.day[row][n], pS.hour[row][n], pS.minute[row][n], pS.second[row][n], pS.wavelength[row][n], pS.irr_total[row][n], pS.irr_direct[row][n], pS.irr_diffuse[row][n]); 
    row ++; 
    if (row == sim_spectrum_constant) { 
     n ++; 
     last_row = row; 
     row = 0; 
    } 
    } 

我是否在構思,實施或兩者都失敗?什麼導致分段錯誤?

謝謝!

+0

這些數組是否在某處初始化? – 2013-05-11 17:57:29

+0

不,這是強制性的嗎?這是我的第一個C程序在十年,對不起:( – 2013-05-11 18:21:08

+0

我剛纔添加的初始化和重新編譯,還是同樣的問題,看來,我已經更新了上面的init是怎麼做的。 – 2013-05-11 18:46:10

回答

0

看來你並沒有評估什麼sscanf返回,它返回它分析的參數的數量,所以這將是一個有用的事情來檢查。通常檢查返回值是好事

此外,如果你有固定的陣列,固定尺寸,那麼你也應該檢查邊界形n不會變得太大。輸入數據往往會讓我們的程序員經常感到驚訝 - 這是一種糟糕的方式。

你的結構看起來過於複雜,帶有一個結構的想法是讓事情變得更簡單和更有條理,但是你把它看作某種巨型變量,在其中存儲所有內容。你應該考慮在那個內部有更多的結構,例如日期可以是一個結構,並且以irr_xxx開頭的成員似乎也可能是結構的可能候選者。

例如

struct irr 
{ 
    float total; 
    float direct; 
    float diffuse; 
}; 
+0

問題解決了!分段錯誤是由於數組很大而導致的,堆棧無法容納它們。 我第一次試圖改變鏈接器參數來增加堆棧可用,但是這並沒有幫助。 然後我重新定義了這樣的結構: __static__ struct spectrum pS; ...並且分段錯誤消失了。 我也考慮到了這裏提供的其他建議,這肯定會使我的程序設計更好。 感謝大家的幫助! 此致 – 2013-05-21 11:42:58