Я хочу создать зубчатые массивы в Фортране, но получаю. Нет специальной подпрограммы для общего «нового» в (1)

Я хочу создать зубчатые массивы в Fortran с несколькими уровнями распределения. Однако я столкнулся с ошибкой «Нет конкретной подпрограммы для общего «нового» в (1)» как для моих процедур конструктора, так и для процедур деструктора.

Я совсем новичок в Фортране. Я считаю, что проблема в том, что мой первый аргумент «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

person Jon Bjarke    schedule 11.05.2020    source источник
comment
Добро пожаловать, я предлагаю совершить тур.   -  person Vladimir F    schedule 11.05.2020


Ответы (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 для передачи в подпрограмму с выделяемым фиктивным аргументом. В современном универсальном устранении неоднозначности на Фортране также учитывается выделяемый атрибут. Вот почему вы получаете исходное сообщение об ошибке.


Имейте в виду, что я также получаю эту ошибку для вашего кода:

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, но это только вам известно.

person Vladimir F    schedule 11.05.2020