代码在这里:
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'
有谁能告诉我该代码有什么问题并给我一些建议?
答案 0 :(得分:0)
问题是,独立界面没有任何意义,因为它的名称必须在程序中要使用的部分内可访问。因此,必须在module
或program
内定义。
我认为,错误源于这样一个事实:program
语句不是必需的,因此您的接口隐含地定义了一个程序,该程序应该以{{1}}语句结束,这是显然不见了。
您可以通过将接口封装在模块中并将子程序保留在模块之外来解决您的问题(否则,您的子程序将具有模块接口)。
end
编辑(建议表格@HighPerformanceMark):您向我们展示的代码的更好解决方案是将子程序本身放入模块并删除界面。在这种情况下,子程序的界面会自动创建,您不必关心它。
module [name]
[your interface]
end module
[your subroutine]