Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我希望用Fortran创建锯齿状数组,但收到;对于泛型‘;新’;第(1)款;_Fortran_Jagged Arrays_Allocatable Array - Fatal编程技术网

我希望用Fortran创建锯齿状数组,但收到;对于泛型‘;新’;第(1)款;

我希望用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

我希望在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

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

欢迎,我建议您选择。