1

更新:我修改后的代码如下所示:

program run_module_test
    use module_test
    implicit none   

    TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)

    call update(xyzArray)
    write(6,*)'xyzArray',xyzArray

end program run_module_test

module module_test
    implicit none

    TYPE :: newXYZ
        real(4) :: x, u
        real(4) :: y, v
        real(4) :: z, w
        real(4),dimension(3) :: uvw     
    END TYPE

    integer(4) :: shape = 3

contains

    subroutine update(xyzArray)

    integer(4) :: i
    TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)
    allocate( xyzArray(shape) ) 

    do i = 1, shape
        xyzArray(i)%x = 0
        xyzArray(i)%y = 0
        xyzArray(i)%z = 0
        xyzArray(i)%u = 0
        xyzArray(i)%v = 0
        xyzArray(i)%w = 0
        xyzArray(i)%uvw = (/0,0,0/)
    end do
    return
    end subroutine update

end module module_test

编译它们时,它们会产生类似的错误:

 TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)
                                                    1
Error: ALLOCATABLE attribute conflicts with DUMMY attribute at (1)

当我消除 update() 子例程中的参数时,我收到一个矛盾的错误:

TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)
                                                       1
Error: Symbol at (1) is not a DUMMY variable

我是否消除了有用建议中指出的错误来源?这可能是与编译器相关的错误(使用 mpi90)吗?

~~~First Edit~~~ 我有一个子程序,它的输入参数是一个用户定义类型XYZ的数组。我希望取消分配 xyzArray 并将其分配/修改为子例程主体中的不同大小。我尝试了通过更改 fortran 中的数组维度建议的方法,但是当我执行以下操作时:

subroutine update(xyzArray, ...)
...
TYPE (XYZ), allocatable :: xyzArray(:)

我收到一条错误消息:

Error: ALLOCATABLE attribute conflicts with DUMMY attribute at (1)

当我尝试:

subroutine update(xyzArray, ...)
...
deallocate( xyzArray(myshape) )
allocate( xyzArray(newshape) )

我收到错误消息:

Error: Expression in DEALLOCATE statement at (1) must be ALLOCATABLE or a POINTER
Error: Expression in ALLOCATE statement at (1) must be ALLOCATABLE or a POINTER

我需要做什么来更改子例程中数组的大小?

4

2 回答 2

6

去做这个:

  • 虚拟参数必须是可分配的。可分配的虚拟参数需要实现 Fortran 2003 标准相关部分的编译器(或实现所谓的“可分配”TR 的 Fortran 95 编译器)。

  • 需要该过程的显式接口(该过程必须是模块过程、内部过程或在调用范围内具有接口块)。

  • 虚拟参数不能是意图(in)。如果您在子例程中根本没有使用虚拟参数值的分配状态或其他方面,那么 intent(out) 可能是合适的(如果事先分配,则在调用过程时虚拟参数将自动释放),否则意图(inout)或没有意图。

(您的第二个示例代码块的 deallocate 语句存在语法错误 - 您应该简单地指定xyzArray变量,省略(myshape)形状规范))

例如,在一个模块中:

subroutine update(xyzArray)
  type(xyz), allocatable, intent(inout) :: xyzArray(:)
  ...
  if (allocated(xyzArray)) deallocate(xyzArray)
  allocate(xyzArray(newshape))
  ...
于 2012-12-10T22:52:21.993 回答
3

如果您确定要在子例程中释放数组,可以将虚拟参数声明为 intent(out),以便在进入子例程时自动释放:

module whatever
  implicit none

  type :: xyz
    :
  end type xyz

  contains

    subroutine update(xyzArray)
      type(xyz), allocatable, intent(out) :: xyzArray(:)
      :
      allocate(xyzArray(someshape))
      :
    end subroutine update

  end module whatever

正如IanH已经指出的那样,进程必须具有显式接口(例如,包含在模块中)并且在调用程序中您必须声明实际参数可分配:

program test
  use whatever
  implicit none

  type(xyz), allocatable :: array(:)
  :
  call update(array)
  :
end program test
于 2012-12-11T10:15:01.513 回答