我希望在 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
,但只有你知道。
我希望在 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
,但只有你知道。