首页 > 解决方案 > 如何编译 .f 文件而不会出现无法分类的语句和意外的文件结尾错误

问题描述

我是 Fortran 新手,我需要它来加速我在 R 中的代码,我在 Arch Linux 中使用 gfortran:这是我的代码之一:

subroutine pkfull(m,n,o,a,b,ps,pk)
    implicit none
    integer,intent(in) :: m,n,o
    integer :: i,j,k
    double precision,intent(in) :: a(o)
    double precision,intent(in) :: b(o)
    double precision,intent(in) :: ps(m,n,o)
    double precision,intent(inout) :: pk(m,n,o)
    do 20,i=1,m
      do 15, j =1,n
       do 10, k=1,o
          pk(i,j,k) = ps(i,j,k)*b(k)+a(k)
10         end do 
15    end do    
20     end do  
end subroutine pkfull 

我运行后得到的错误:$R CMD SHLIB pkfull.f

   gfortran -fno-optimize-sibling-calls  -fpic  -g -O2  -c pkfull.f -o pkfull.o
   pkfull.f:12:24:

   12 |                   pk(i,j,k) = ps(i,j,k)
      |                        1
   Error: Unclassifiable statement at (1)
   pkfull.f:16:2:

   16 | end subroutine pkfull
   |  1
    Error: Non-numeric character in statement label at (1)
   f951: Error: Unexpected end of file in ‘pkfull.f’
   make: *** [/usr/lib64/R/etc/Makeconf:190: pkfull.o] Error 1

标签: rfortrangfortransubroutine

解决方案


我复制了您的代码并尝试编译。这可能只是每行开头的空格问题。确保所有行都从第 7 列开始,将第一列保留为注释,第 6 列用于任何继续标记,并将任何行号放在第 2 列以后。所以你的代码应该如下:

      SUBROUTINE pkfull(m,n,o,a,b,ps,pk)
      IMPLICIT NONE
      INTEGER,INTENT(IN) :: m,n,o
      integer :: i,j,k
      double precision,intent(in) :: a(o)
      double precision,intent(in) :: b(o)
      double precision,intent(in) :: ps(m,n,o)
      double precision,intent(inout) :: pk(m,n,o)
      do 20,i=1,m
       do 15, j =1,n
        do 10, k=1,o
           pk(i,j,k) = ps(i,j,k)*b(k)+a(k)
 10     end do
 15    end do
 20   end do
      end subroutine pkfull

推荐阅读