Я знаю, что люди задают много вопросов об сегментации, но я приложил все усилия для решения этой проблемы более трех часов и до сих пор не смог решить эту проблему. :/Так вот мой код:Еще одна хорошая ошибка сегментации сегмента в 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 целая петля не работает. Какая странная ошибка! Надеюсь, что я смогу помочь в этом.
Проведите еще 5 минут, чтобы правильно форматировать ваш код. Помогите нам помочь вам. Тогда скажите нам, что вы уже использовали свой компилятор, чтобы увидеть, что ваш код не блуждает по концу любого из массивов. И, конечно, всегда используйте 'implicit none' - я не вижу, чтобы это было проблемой для вас, поскольку вы уже явно объявляете тип переменных. –