1

我希望在 Fortran 中创建具有多级分配的锯齿状数组。但是,对于我的构造函数和析构函数过程,我都遇到了“在 (1) 处没有通用'new' 的特定子例程”的错误。

我是 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
4

1 回答 1

1

在这些情况下,调试错误消息的最佳方法是调用实际的特定子例程。这意味着调用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,但只有你知道。

于 2020-05-11T15:55:20.087 回答