我希望在 Fortran 中创建 Jagged 数组但收到 "There is no specific subroutine for the generic ‘new’ at (1)"

I wish to create Jagged arrays in Fortran but receives "There is no specific subroutine for the generic ‘new’ at (1)"

我希望在 Fortran 中创建具有多级分配的锯齿状数组。但是我 运行 我的构造函数和析构函数过程都出现了 "There is no specific subroutine for the generic ‘new’ at (1)" 的错误。

我对 Fortran 很陌生。我认为问题是我的第一个参数 "M1" 不合适。但是,我似乎无法弄清楚为什么。

module JaggedArrayModule
  implicit none
  save
  private
  public JaggedArray, New, Delete

  type JaggedArray
    private
    real, allocatable               :: vector(:)
  end type

  interface New
    module procedure NewMatrix
  end interface

  interface Delete
    module procedure DeleteMatrix
  end interface

contains

  subroutine NewMatrix(Matrix, maxsize)
    type (JaggedArray), intent(out), allocatable   :: Matrix(:)
    integer                                        :: maxsize, i

    allocate(Matrix(maxsize))
    do i=1, maxsize
      allocate(Matrix(i)%vector(i))
    enddo
  end subroutine

  subroutine DeleteMatrix(Matrix, maxsize)
    type (JaggedArray), intent(inout), allocatable :: Matrix(:)
    integer                                        :: maxsize, i    

    do i=1, maxsize
      deallocate(Matrix(i)%vector(i))
    enddo
    deallocate(Matrix)   
  end subroutine

end module



program main
use JaggedArrayModule
type (JaggedArray) :: M1(5)

call New(M1, 10)
call Delete(M1, 10)


end program

在这些情况下,调试错误消息的最佳方法是调用实际的特定子例程。这意味着调用 NewMatrix 而不是 Matrix.

那么你会得到

 call NewMatrix(M1, 10)
               1
Error: Actual argument for ‘matrix’ must be ALLOCATABLE at (1)
jagged.f90:51:18:

 call DeleteMatrix(M1, 10)
                  1
Error: Actual argument for ‘matrix’ must be ALLOCATABLE at (1)

这几乎是不言自明的。 M1 必须是 allocatable 才能传递给具有可分配伪参数的子例程。在现代 Fortran 中,通用消歧还考虑了可分配属性。这就是您收到原始错误消息的原因。


请注意,您的代码也出现此错误:

jagged.f90:37:17:

       deallocate(Matrix(i)%vector(i))
                 1
Error: Allocate-object at (1) must be ALLOCATABLE or a POINTER

你应该只使用

deallocate(Matrix(i)%vector)

但是,可分配的组件会自动解除分配。不需要专门的(最终化)子例程来执行此操作。

分配语句

allocate(Matrix(i)%vector(i))

也可能想要其他尺寸,而不是 i,但只有你知道。