Ошибка выполнения Fortran: конец файла для распределяемых массивов

katlynisgreatlyn спросил: 13 июня 2018 в 07:56 в: arrays

Я выполняю назначение для класса, где нам нужно написать программу с использованием распределяемых массивов для хранения произвольного количества пар данных 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 pairsreal, 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
enddoallocate (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)
enddodo i=1,n,1
  read(lun1,*) y(i)
enddoclose(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 =", Rdeallocate (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 fileError 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 ответ

Есть решение
High Performance Mark ответил: 13 июня 2018 в 08:14

Если я правильно понял, что ошибка может быть здесь ...

do i=1,n,1
  read(lun1,*) x(i)
enddodo 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.

katlynisgreatlyn ответил: 13 июня 2018 в 08:17
Это избавило от ошибки времени выполнения (спасибо огромное!), Но теперь я получаю это: коэффициент корреляции R = NaN STOP 0
High Performance Mark ответил: 13 июня 2018 в 08:24
Если у вас есть другой вопрос, задайте другой вопрос. Если вы считаете, что у вас есть расширение к существующему вопросу, то расширяйте существующий вопрос. Но давайте не будем вмешиваться в строку Qs и As в чате, это не так, как SO нравится работать.
katlynisgreatlyn ответил: 13 июня 2018 в 08:26
Ок, извините, первый раз здесь! Благодаря!

Дополнительное видео по вопросу: Ошибка выполнения Fortran: конец файла для распределяемых массивов

C Program for Matrix Multiplication in Hindi

Fortran 77 tutorial 7 arrays

QB64 Tutorial 16 - Matrix