Фортран производные типы - PullRequest
0 голосов
/ 26 сентября 2018

Мне было интересно, возможно ли каким-либо образом определить производный тип в Фортране, который автоматически возвращает правильный тип, без вызова конкретного типа, например, var%real?Вот пример, чтобы объяснить, что я имею в виду:

module DervType

  implicit none

  type, public :: mytype
    real(8) :: r
    integer :: i
    logical :: l
  end type

end module DervType

program TestType

  use DervType

  implicit none

  type(mytype) :: test

  test = 1.                   !! <-- I don't want to use test%r here

end program TestType

Было бы это возможно, определив какое-то назначение интерфейса (перегрузка =) или что-то в этом роде?Это вообще возможно?

Спасибо!Любая помощь приветствуется!

1 Ответ

0 голосов
/ 02 октября 2018

Нашел решение для этого, и это было на самом деле довольно просто.Вот код:

module DervType

  implicit none

  type, public :: mytype
    real(8)                       :: r
    integer                       :: i
    character(len=:), allocatable :: c
    logical :: l
  end type

  interface assignment(=)                 // overload = 
    module procedure equal_func_class
  end interface

contains

  subroutine equal_func_class(a,b)

    implicit none

    type(mytype), intent(out) :: a
    class(*), intent(in)      :: b

    select type (b)
        type is (real)
            print *, "is real"
            a%r = b
        type is (integer)
            print *, "is int"
            a%i = b
        type is (character(len=*))
            print *, "is char"
            a%c = b
        type is (logical)
            print *, "is logical"
            a%l = b 
    end select

    return

  end subroutine equal_func_class  

end module DervType

program TestType

  use DervType

  implicit none

  type(mytype) :: test

  test = 1.      // assign real 
  test = 1       // assign integer
  test = "Hey"   // assign character
  test = .true.  // assign logical

  print *, "Value (real)      : ", test%r
  print *, "Value (integer)   : ", test%i
  print *, "Value (character) : ", test%c
  print *, "Value (logical)   : ", test%l

end program TestType

Сейчас я пытаюсь использовать переменные в программе (например, сделать некоторые арифметические вычисления и т. Д.), Но это кажется довольно сложным, если не невозможным.Я мог бы начать другой вопрос об этом.

...