2017-11-16 5 views
0

ist es möglich, mit modernen Fortran (90, 2003 oder sogar 2008) einen benutzerdefinierten Typen zu haben, wo eines des Attributs standardmäßig zugegriffen werden würde:Zugang Fortran benutzerdefinierter Typ Attribute standardmäßig

program test 
    use iso_fortran_env 
    type MYTYPE_t 
     real(real64) :: data 
    end type MYTYPE_t 

    type(MYTYPE_T) :: test 
    real(real64) :: foo 

    ! This works 
    test%data = 5.0 
    ! Is there a way to be able things like this: 
    test = 5.0 
    print*, sqrt(test) 

    foo = test + 3 
end program 
+1

Hat definierte Zuordnung Ihre Anforderungen abdecken? – IanH

+0

Es funktioniert irgendwie. Aber das Problem ist, dass man dann alle Standardoperatoren überschreiben muss, und es wird nicht mit Fortran-Intrinsics funktionieren. – cphyc

+0

Es wird funktionieren, sehe meine Antwort. –

Antwort

0

Sie überlasten müssen alle möglichen Aufgaben, Operatoren und Intrinsics. Ja, es ist eine Menge Arbeit. Nein, es gibt keinen schnelleren Weg, der eine automatische Konvertierung in allen Kontexten verursachen würde.

module types 
    use iso_fortran_env 

    implicit none 

    type MYTYPE_t 
     real(real64) :: data 
    contains 
     procedure assign 
     procedure add 
     generic :: assignment(=) => assign 
     generic :: operator(+) => add 
    end type MYTYPE_t 

    interface sqrt 
     procedure sqrt_MTYPE 
    end interface 

contains 

    subroutine assign(l,r) 
     class(MYTYPE_t), intent(out) :: l 
     real(real32), intent(in) :: r 
     l%data = r 
    end subroutine 

    real(real64) function sqrt_MTYPE(x) 
     type(MYTYPE_t), intent(in) :: x 
     sqrt_MTYPE = sqrt(x%data) 
    end function 

    real(real64) function add(x, y) 
     class(MYTYPE_t), intent(in) :: x 
     integer, intent(in) :: y 

     add = x%data + y 
    end function 
end module types 

program test_program 
    use types 

    implicit none 

    type(MYTYPE_T) :: test 
    real(real64) :: foo 

    ! This works 
    test%data = 5.0 
    ! Is there a way to be able things like this: 
    test = 5.0 
    print*, sqrt(test) 

    foo = test + 3 
end program 

Test:

> gfortran override3.f90 
> ./a.out 
    2.2360679774997898 
+0

Super! Ich wusste nicht, dass Dinge wie "sqrt_MTYPE" funktionieren könnten. Vielen Dank – cphyc

Verwandte Themen