2016-02-14 1 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 сделать = 1, 12 чтения (100, 1150) дня (я), nmonth (я), год (я), $ часов (я) , Nmin (я), 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 (я, 1), avgP (я, 2), avgP (I, 3), avgP (я, 4), $ avgP (я, 5), avgP (я, 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 ФОРМАТ (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» процессы начинают калечить один за другим. например, при i = 1 цикл выполняется хорошо. Тогда при i = 2 avgP (i, 6) = avgP (i, 6) + w4 (j) вызывает сегрегацию. При i = 3 avgP (i, 5) = avgP (i, 5) + w3 (j) вызывает сегрегацию, а в конце при 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=12 однако D имеет такие размеры 1:12 так, кто знает, что записывается в tst и его последствия.

Это должно быть обнаружено путем включения проверки границ.

 Смежные вопросы

  • Нет связанных вопросов^_^