我希望用Fortran创建锯齿状数组,但收到;对于泛型‘;新’;第(1)款;
我希望在Fortran中创建具有多个分配级别的交错数组。然而,对于我的构造函数和析构函数过程,我遇到了一个错误,即“在(1)处的泛型“new”没有特定的子例程” 我对Fortran很陌生。我认为问题在于我的第一个论点“M1”不合适。然而,我似乎不明白为什么我希望用Fortran创建锯齿状数组,但收到;对于泛型‘;新’;第(1)款;,fortran,jagged-arrays,allocatable-array,Fortran,Jagged Arrays,Allocatable Array,我希望在Fortran中创建具有多个分配级别的交错数组。然而,对于我的构造函数和析构函数过程,我遇到了一个错误,即“在(1)处的泛型“new”没有特定的子例程” 我对Fortran很陌生。我认为问题在于我的第一个论点“M1”不合适。然而,我似乎不明白为什么 module JaggedArrayModule implicit none save private public JaggedArray, New, Delete type JaggedArray priva
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
必须是可分配的,才能传递给具有可分配伪参数的子例程。在现代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
,但只有您知道。欢迎,我建议您选择。