увеличить массив в модуле - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь написать небольшой модуль / класс на Фортране.Идея очень проста:

  1. Создать и инициализировать объект с помощью специального конструктора
  2. Добавить новый элемент внутри него

Я уже пишу на Фортранено только подпрограмма и я постараюсь использовать принцип ориентированного объекта.В настоящее время у меня есть две ошибки:

  1. построенный мной конструктор не работает (кажется, не принимает мои входные аргументы) ...
  2. процедура add_bb не принята.

MNWE:

   module test_mod
    implicit none

    type :: bb
       real :: item
       real,allocatable :: vect(:)
    end type bb

    interface bb
       procedure :: new_bb!,add_bb
    end interface bb

  contains

    type(bb) function new_bb(val,nbv)
      real, intent(in) :: val
      integer, intent(in) :: nbv
      integer :: ii

      new_bb%item=val
      allocate(new_bb%vect(nbv))

      print *,nbv
      do ii=1,nbv
        new_bb%vect(ii)=val
        print *,ii
      enddo

      print *,new_bb%vect
    end function new_bb

    type(bb)  function add_bb(it)
        real,intent(in) :: it
        integer :: sp
        real,allocatable :: tmp(:)

        sp=size(add_bb%vect)+1

        allocate(tmp(sp))
        tmp(1:sp-1) = add_bb%vect(1:sp-1)
        call move_alloc(tmp, add_bb%vect)
        add_bb%vect(sp)=it
    end function add_bb
  end module test_mod

  program test
    use test_mod
    implicit none

    type(bb) :: cc
    cc=bb(10,20)
    call cc%add_bb(10)

    print *,cc%item
    print *,cc%vect
    !
  end program test

1 Ответ

0 голосов
/ 04 июля 2019

Я пытался исправить ошибки в вашем коде, но по мере того, как я над этим работал, я обнаружил все больше и больше фундаментальных недостатков в вашем коде. Очевидно, это означает, что вы, вероятно, не очень хорошо знакомы с ООП, в частности, на Фортране. Поэтому я рекомендую вам взять книгу, например, "Modern Fortran Explained" Metcalf et al. и изучите эту тему. Между тем, вот пересмотренная версия вашего кода, которая по крайней мере работает без синтаксической ошибки:

   module test_mod
    implicit none

    type :: bb_type
       real :: item
       real, allocatable :: vect(:)
    contains
       procedure, pass :: add_bb
    end type bb_type

    interface bb_type
       procedure :: construct_bb
    end interface bb_type

  contains

    function construct_bb(val,nbv) result (bb)
      real, intent(in) :: val
      integer, intent(in) :: nbv
      type(bb_type) :: bb
      integer :: ii

      bb%item=val
      allocate(bb%vect(nbv))

      print *,nbv
      do ii=1,nbv
        bb%vect(ii)=val
        print *,ii
      enddo

      print *,bb%vect
    end function construct_bb

    subroutine add_bb(self,it)
        class(bb_type), intent(inout) :: self
        real,intent(in) :: it
        integer :: sp
        real, allocatable :: tmp(:)
        sp=size(self%vect)+1
        allocate(tmp(sp))
        !tmp(1:sp-1) = self%vect(1:sp-1)
        !call move_alloc(tmp, self%vect)
        !self%vect(sp)=it

end subroutine add_bb

  end module test_mod

  program test
    use test_mod
    implicit none

    type(bb_type) :: cc, dd
    cc=bb_type(10,[20])
    call dd%add_bb(10.0)

    print *,cc%item
    print *,cc%vect
    !
  end program test
...