回 帖 发 新 帖 刷新版面

主题:新手请教fortran编程问题subroutine

program arraytest2
implicit none
integer,allocatable::a(:)
integer::b(2)=(/1,3/)
call sub(a,b)
print*,a
pause
end program

subroutine sub(a,b)
integer,intent(out),allocatable::a(:)
integer,intent(in)::b
allocate(a(size(b)))
a=b+1
end subroutine

编译integer,intent(out),allocatable::a(:)这一行出现一个错误:
Error: A dummy argument name is invalid in this context.   [A]

实际上,我的源程序是要从subroutine输出一个数组,其长度是在subroutine运行过程中确定的。因此我在主程序里声明integer,allocatable::a(:),在subroutine里声明integer,intent(out),allocatable::a(:)。
因源程序较长,不详细贴出了。谢谢您的回答,任何建议都非常感激!

回复列表 (共2个回复)

沙发

程序需要改改:
program arraytest2
    implicit none
    integer,allocatable::a(:)
    integer::b(2)=(/1,3/)
    call sub(a,b,size(b))
    print*,a
    pause
contains
    subroutine sub(aa,bb,sszb)
        integer,intent(out),allocatable::aa(:)
        integer,intent(in) ::bb(*),sszb
        allocate(aa(sszb))
        aa=bb(1:sszb)+1
    end subroutine
end program

并且需要在新版本的IVF中编译(CVF是不可以的喔)
因为传递的B数组如果是静态分配的,那无法从子程序中取其大小,故加多一个参数就行了:)

板凳

Module AllocatableDummyArgument
  implicit none
  
contains 
  subroutine sub(a, b)   ! Fortran 2003 Standard
    implicit none
    integer, intent(out), allocatable:: a(:)
    integer, intent(in):: b(:)
    ! *** *** *** Intermediate Variable *** *** ***
    integer:: state
    character(len = 40):: Err_Msg
    
    allocate( a(size(b)), stat = state, errmsg = Err_Msg )
    If (state == 0) Then
      a = b + 1
    Else 
      write(*, *) Err_Msg
    End If   ! state
    return
  end subroutine  
  
End Module



program main
  use AllocatableDummyArgument
  implicit none
  integer, allocatable:: a(:)
  
  integer:: b(3) = (/1, 3, 5/)
  call sub(a, b)
  write(*, *) a
 
  stop
end program main

我来回复

您尚未登录,请登录后再回复。点此登录或注册