2012-03-12 8 views
5

Ho un tipo T derivato da Fortran che contiene matrici di dati di (molti) diversi gradi e tipi. Questi array sono nascosti all'interno di una struttura di dati complessa e vorrebbe avere una funzione getter che procede come segue:Sovraccarico della funzione legata al tipo in Fortran 2003

a => T%get(data_id) 

dove "a" è un puntatore di dato tipo, e data_id è un numero intero che è usato per trovare i dati all'interno della struttura dei dati. Lo faccio sovraccaricando molte funzioni "get_thistype()" sotto un nome generico.

TYPE T 
    PROCEDURE :: get_real 
    PROCEDURE :: get_integer 
    GENERIC :: get => get_real,get_integer 
END TYPE 

Questo funziona se il get_thistype) routine (sono sottoprogrammi, ma non se sono scritti come funzioni. Questo significa che il mio codice assomiglia a:

CALL T%get(a,data_id) 

che trovo molto meno leggibile. C'è un modo per sovraccaricare le funzioni che hanno lo stesso elenco di argomenti ma tipi di ritorno diversi? o devo usare subroutine per quello?

+1

Penso che sarebbe difficile per il compilatore capire la funzione corretta basata esclusivamente sui tipi restituiti, quindi è probabilmente impossibile. Vorrei solo usare le subroutine. – bdforbes

risposta

5

Quando un'istruzione di assegnazione (puntatore) viene eseguita in fortran, la parte destra viene sempre valutata completamente prima che l'assegnazione abbia luogo. Ciò avviene indipendentemente dalla parte sinistra, quindi non c'è assolutamente modo che la LHS possa influenzare il risultato della valutazione del RHS. È solo il modo in cui è progettato il linguaggio.

+0

Dannazione ... Ma grazie lo stesso! – calys

0

Ho appena imbattuto in questo post, in modo a beneficio di nessuno di vedere in futuro:

Se ho capito bene la domanda, è possibile eseguire questa sovraccaricando l'operatore di assegnazione. Esempio:

file di X.f90:

MODULE XModule 

TYPE :: X 
    INTEGER, DIMENSION(:), POINTER :: IntArray 
    REAL, DIMENSION(:), POINTER :: RealArray 
END TYPE 

INTERFACE ASSIGNMENT (=) 
    MODULE PROCEDURE PointToInt 
    MODULE PROCEDURE PointToReal 
END INTERFACE 

CONTAINS 

SUBROUTINE PointToInt(Ip, V) 
    INTEGER, POINTER, DIMENSION(:), INTENT(OUT) :: Ip 
    TYPE(X), INTENT(IN) :: V 
    Ip => V%IntArray 
END SUBROUTINE PointToInt 

SUBROUTINE PointToReal(Rp, V) 
    REAL, POINTER, DIMENSION(:), INTENT(OUT) :: Rp 
    TYPE(X), INTENT(IN) :: V 
    Rp => V%RealArray 
END SUBROUTINE PointToReal 

END MODULE 

prova file del driver Driver.f90:

PROGRAM Driver 
USE XModule 
TYPE(X) :: Var 
INTEGER, DIMENSION(:), POINTER :: I 
REAL, DIMENSION(:), POINTER :: R 

ALLOCATE(Var%IntArray(2)) 
ALLOCATE(Var%RealArray(3)) 

Var%IntArray = [1, 2] 
Var%RealArray = [1., 2., 3.] 

I = Var 
PRINT*, I 

R = Var 
PRINT*, R 

END PROGRAM 

uscita:

  1   2 
    1.000000  2.000000  3.000000  

Spero che questo aiuti.

Problemi correlati