I was wondering if it is somehow possible to define a derived type in Fortran which automatically returns the right type, without calling the type specifically e.g. var%real
? Here's an example to explain what I mean:
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
Would this be possible by defining some sort of interface assignment (overload the =) or something like that? Is this even possible?
Thanks! Any help appreciated!
Found a solution to this and it was actually quite simple. Here's the code:
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
I'm trying to use the variables within a program now (e.g. do some arithmetic calculations, etc.) but that seems to be rather difficult if not impossible. I might start another question about that.