2016-02-14 33 views
-2

我知道人們在這裏問了很多細分問題,但我已經花了三個多小時解決了這個問題,但仍然無法解決這個問題。 :/因此,這裏是我的代碼:Fortran中的另一個好的分段錯誤

c  sinle event analysis 

    implicit real(a-h,o-z) 
    real day(12), nmonth(12), year(12), clas(12), 
$ hour(12), nmin(12) 
    integer mark(12) 
    real tst(12), D(12), avgP(12,6), avgA(12,6) 
    integer k, m, n, g 

    real time(2054904), proa(2054904), prob(2054904), w1(2054904), 
$ w2(2054904), w3(2054904), w4(2054904) 

    D(1) = 31; D(2) = 28; D(3) = 31; D(4) = 30; D(5) = 31; 
    D(6) = 30; D(7) = 31; D(8) = 31; D(9) = 30; D(10) = 31; 
    D(11) = 30; D(12) = 31 

    open(100,file='singleE.dat') 

    do i=1, 12 
    tst(i)=0 
    enddo 

900做I = 1,12 讀(100,1150),日(I),nmonth(I),一年(我), $小時(我) ,n最小(i)中,CLAS(ⅰ)

do j=1, 12 
    if (int(nmonth(i)).EQ.(13-j)) then 
    tst(i) = tst(i) + D(12-j) 
    nmonth(i) = nmonth(i)-1 
    endif 
    enddo 

    tst(i) = tst(i) + day(i) + (year(i) - 2010)*365 
$ + (hour(i) + nmin(i)/60)/24 

    if (year(i) > real(2011)) then 
    tst(i) = tst(i) + 1 
    endif 
    enddo 

    open(200,file='hole.dat',status='OLD') 

    k = 0 

    do i=1, 2054904 
    read(200,950) time(i), proa(i), prob(i), 
$ w1(i), w2(i), w3(i), w4(i) 
    enddo 

    mark = 0 

    do i=1, 12 
    do j=1, 2054904 
    k = k + 1 
    if(abs(tst(i)-time(j))<0.0001) then 
    mark(i) = k 
    endif 
    enddo 
    enddo  

    n = 5; 

    do i= 1, 12 
    do j= 1,6 
    avgP(i,j) = 0 
    avgA(i,j) = 0 
    enddo 
    enddo 



    do i=1, 12 
    if (mark(i).EQ.0) then 
    go to 750 
    endif 

    do j = (mark(i)-(n+1)*1440), (mark(i)-n*1440) 
    avgP(i,1) = avgP(i,1) + proa(j) 
    avgP(i,2) = avgP(i,2) + prob(j) 
    avgP(i,3) = avgP(i,3) + w1(j) 
    avgP(i,4) = avgP(i,4) + w2(j) 
    avgP(i,5) = avgP(i,5) + w3(j) 
    avgP(i,6) = avgP(i,6) + w4(j) 
    enddo 

    do g = (mark(i)+n*1440), (mark(i)+(n+1)*1440) 
    avgA(i,1) = avgA(i,1) + proa(g) 
    avgA(i,2) = avgA(i,2) + prob(g) 
    avgA(i,3) = avgA(i,3) + w1(g) 
    avgA(i,4) = avgA(i,4) + w2(g) 
    avgA(i,5) = avgA(i,5) + w3(g) 
    avgA(i,6) = avgA(i,6) + w4(g) 
    enddo 

750打印*,avgP(I,1),avgP(I,2),avgP(I,3),avgP(I,4), $ avgP(I,5),avgP(I,6)

enddo 

850接近(ⅰ)

950格式(F12.7,2x,E10.3,2x,E10.3,2x,E10.3,2x,E10.3, $ 2x,E10.3,2x,E10.3)

1150 FORMAT(F2.0,1x,F2.0,1x,F4.0,1x,F2.0,1x,F2.0,4x F3.1)

end 

,導致該部分我麻煩是這裏的循環:

do i=1, 12 
    if (mark(i).EQ.0) then 
    go to 750 
    endif 

    do j = (mark(i)-(n+1)*1440), (mark(i)-n*1440) 
    avgP(i,1) = avgP(i,1) + proa(j) 
    avgP(i,2) = avgP(i,2) + prob(j) 
    avgP(i,3) = avgP(i,3) + w1(j) 
    avgP(i,4) = avgP(i,4) + w2(j) 
    avgP(i,5) = avgP(i,5) + w3(j) 
    avgP(i,6) = avgP(i,6) + w4(j) 
    enddo 

    do g = (mark(i)+n*1440), (mark(i)+(n+1)*1440) 
    avgA(i,1) = avgA(i,1) + proa(g) 
    avgA(i,2) = avgA(i,2) + prob(g) 
    avgA(i,3) = avgA(i,3) + w1(g) 
    avgA(i,4) = avgA(i,4) + w2(g) 
    avgA(i,5) = avgA(i,5) + w3(g) 
    avgA(i,6) = avgA(i,6) + w4(g) 
    enddo 


    enddo 

使用gdb,我發現'j'循環造成麻煩。所有的參數都很好,但是每次執行程序時,'j​​'循環只會執行一次。特別的是,隨着'我'的增加,流程開始逐漸削弱。例如,在i = 1時,循環執行得很好。然後,在i = 2時,avgP(i,6)= avgP(i,6)+ w4(j)導致seg故障。在i = 3時,avgP(i,5)= avgP(i,5)+ w3(j)導致seg故障並且最終在i = 7時,整個迴路不起作用。多麼奇怪的錯誤!希望我能得到一些幫助。

+1

再花5分鐘左右格式化您的代碼。讓我們很容易幫助你。然後告訴我們你已經使用過你的編譯器來看看你的代碼不會在任何數組的末尾遊走。當然,總是使用'implicit none' - 我已經明確地聲明瞭變量的類型,因此我無法看到這對您是個問題。 –

回答

1

循環

do j=1, 12 if (int(nmonth(i)).EQ.(13-j)) then tst(i) = tst(i) + D(12-j) nmonth(i) = nmonth(i)-1 endif enddo 可能試圖訪問值D(0)然而時j=12D的尺寸1:12所以誰知道什麼是被寫入tst及其後果。

這應該通過打開邊界檢查來抓住。