Ошибка времени выполнения 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.

Другие вопросы по тегам