错误:期待fortran中的END PROGRAM语句

时间:2014-09-12 04:34:15

标签: fortran gfortran

代码在这里:

interface
    subroutine csrcoo (nrow,job,nzmax,a,ja,ia,nnz,ao,ir,jc,ierr) bind(c,name="CSRCOO")
    use iso_c_binding
    implicit none
    integer(c_int), value :: nrow,job,nzmax,nnz
    real(c_double) :: a(*),ao(*)
    integer(c_int) :: ir(*),jc(*),ja(*),ia(nrow+1),ierr
    end subroutine csrcoo
end interface

subroutine csrcoo (nrow,job,nzmax,a,ja,ia,nnz,ao,ir,jc,ierr)
    integer :: nrow,job,nzmax,nnz
    real*8 :: a(*),ao(*)
    integer :: ir(*),jc(*),ja(*),ia(nrow+1),ierr

    integer :: i,k,k1,k2
    ierr = 0
    nnz = ia(nrow+1)-1

    if (nnz > nzmax) then
        ierr = 1
        return
    endif

    goto (3,2,1) job
    1 do 10 k=1,nnz
        ao(k) = a(k)
    10 END DO
    2 do 11 k=1,nnz
        jc(k) = ja(k)
    11 END DO

    3 do 13 i=nrow,1,-1
        k1 = ia(i+1)-1
        k2 = ia(i)
        do 12 k=k1,k2,-1
            ir(k) = i
        12 END DO
    13 END DO
    return
end subroutine csrcoo

当我使用gfortran编译这样的代码时:gfortran -O2 -c test.f90 它总是显示此错误:

test.f90:11:

subroutine csrcoo (nrow,job,nzmax,a,ja,ia,nnz,ao,ir,jc,ierr)
1
Error: Unclassifiable statement at (1)
test.f90:41.3:

end subroutine csrcoo
   1
Error: Expecting END PROGRAM statement at (1)
Error: Unexpected end of file in 'test.f90'

有谁能告诉我该代码有什么问题并给我一些建议?

1 个答案:

答案 0 :(得分:0)

问题是,独立界面没有任何意义,因为它的名称必须在程序中要使用的部分内可访问。因此,必须在moduleprogram内定义。

我认为,错误源于这样一个事实:program语句不是必需的,因此您的接口隐含地定义了一个程序,该程序应该以{{1​​}}语句结束,这是显然不见了。

您可以通过将接口封装在模块中并将子程序保留在模块之外来解决您的问题(否则,您的子程序将具有模块接口)。

end

编辑(建议表格@HighPerformanceMark):您向我们展示的代码的更好解决方案是将子程序本身放入模块并删除界面。在这种情况下,子程序的界面会自动创建,您不必关心它。

module [name]
    [your interface]
end module

[your subroutine]