Ошибка времени выполнения Fortran: конец файла для размещаемых массивов
Я делаю задание для класса, в котором нам нужно написать программу с использованием выделяемых массивов для хранения произвольного числа пар данных x и y, соответственно распределить размеры массивов, а затем вычислить коэффициент корреляции производимой линии, То, что я до сих пор, это:
!Calculate Correlation Coefficient
program array2
implicit none
!Variables Used:
! x = x array
! y = y array
! n = length of the file/# of x,y pairs
real, allocatable :: x(:)
real, allocatable :: y(:)
integer, parameter :: lun1=1
integer :: n=0
integer :: i,max_val
integer :: ierror=0
real :: sum_x,sum_y,sum_x2,sum_y2,sum_xy,x_mean,y_mean,m,b,R
! Open the file
open(unit=lun1,file='xyfile.dat',status='old',iostat=ierror)
if(ierror /= 0) then
write(*,*) "Could not read file"
stop 1
endif
! Get length of file (# of x,y pairs)
do while(ierror==0)
read(lun1,*,iostat=ierror) max_val
if(ierror==0) then
n=n+1
else
exit
endif
enddo
allocate (x(n)) !allocate space for x array
allocate (y(n)) !allocate space for y array
rewind(lun1)
do i=1,n,1
read(lun1,*) x(i)
enddo
do i=1,n,1
read(lun1,*) y(i)
enddo
close(unit=lun1) !close the file
! Precalculate sum(xy)
sum_xy=0
do i=1,n
sum_xy=sum_xy+(x(i)*y(i))
enddo
! Precalculate sum(x)
sum_x=0
do i=1,n
sum_x=sum_x+x(i)
enddo
! Precalculate sum(y)
sum_y=0
do i=1,n
sum_y=sum_y+y(i)
enddo
! Precalculate sum (x^2)
sum_x2=0
do i=1,n
sum_x2=sum_x2+(x(i)*x(i))
enddo
! Precalculate sum (y^2)
sum_y2=0
do i=1,n
sum_y2=sum_y2+(y(i)*y(i))
enddo
! Precalculate mean x and mean y
x_mean=sum_x/n
y_mean=sum_y/n
! Calculate slope
m=(sum_xy-(sum_x*y_mean))/(sum_x2-(sum_x*x_mean))
! Calculate intercept
b=y_mean-(m*x_mean)
! Calculate R
R=((n*(sum_xy))-(sum_x*sum_y))/sqrt((n*sum_x2)-(sum_x**2.0)*(n*sum_y2)-(sum_y**2.0))
write (*,*) "The correlation coefficient R =", R
deallocate (x)
deallocate (y)
stop 0
end program array2
Он прекрасно компилируется (с использованием fortran 90 и gfortran), и я создал тестовый файл с именем xyfile.dat, но я получаю это сообщение об ошибке:
At line 48 of file array2.f90 (unit = 1, file = 'xyfile.dat')
Fortran runtime error: End of file
Error termination. Backtrace:
#0 0x7f7aa5786f3a
#1 0x7f7aa5787a45
#2 0x7f7aa57881bc
#3 0x7f7aa584b3a3
#4 0x7f7aa5846109
#5 0x4012f5
#6 0x40181a
#7 0x7f7aa50bdf44
#8 0x400c48
#9 0xffffffffffffffff
Что мне не хватает? Мой фальшивый файл содержит 20 строк пар xy и ввод в конце (который я видел как предложение), и это файл, который работает с другим кодом, поэтому я не уверен, что происходит. Пожалуйста, имейте в виду, что я чрезвычайно новичок в этом, поэтому очевидные вещи не могут быть очевидными для меня. Любая помощь приветствуется!
Кроме того, что-то не связанное, я не уверен, нужно ли мне вычислять наклон или перехват, но мой друг, который помогал мне, сказал, чтобы поставить его на основе информации о назначении, так что давайте просто проигнорируем это сейчас, если это не так вызывая ошибку.:)
1 ответ
Если я правильно вас понял, ошибка может быть здесь...
do i=1,n,1
read(lun1,*) x(i)
enddo
do i=1,n,1
read(lun1,*) y(i)
enddo
Первый цикл читает каждую строку в файле и получает x
ценность от этого. Он игнорирует любое значение в строке после первого значения. Когда начинается следующий цикл, вы уже прочитали все строки в файле, и больше не осталось y
значения от. Вы, вероятно, должны написать
do i=1,n,1
read(lun1,*) x(i), y(i)
enddo
и читать как x
а также y
значения из каждой строки, прежде чем читать следующую.
Кстати, если вы планируете редактировать этот вопрос или задавать другим, попробуйте привыкнуть показывать нам, на какой строке находится компилятор, не рассчитывайте, что мы сможем сосчитать до 48.