Fortran runtime error: End of file for allocatable arrays
Fortran runtime error: End of file for allocatable arrays
我正在为 class 赋值,我们需要编写一个程序,使用可分配数组来保存任意数量的 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 对,最后有一个 enter(我认为这是一个建议),而且它是一个与其他代码一起工作的文件,所以我不确定发生了什么。请记住,我对此非常陌生,所以显而易见的事情对我来说可能并不明显。任何帮助表示赞赏!
另外,有点不相关,我不确定是否需要计算斜率或截距,但是我的一个帮助我的朋友说根据分配信息放入它,所以我们忽略它现在,如果它没有导致错误。 :)
如果我没理解错的话,错误可能出在这里...
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。
我正在为 class 赋值,我们需要编写一个程序,使用可分配数组来保存任意数量的 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 对,最后有一个 enter(我认为这是一个建议),而且它是一个与其他代码一起工作的文件,所以我不确定发生了什么。请记住,我对此非常陌生,所以显而易见的事情对我来说可能并不明显。任何帮助表示赞赏!
另外,有点不相关,我不确定是否需要计算斜率或截距,但是我的一个帮助我的朋友说根据分配信息放入它,所以我们忽略它现在,如果它没有导致错误。 :)
如果我没理解错的话,错误可能出在这里...
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。