2012-03-12 8 views
5

Mam typ T pochodzący z Fortrana, który zawiera tablice danych (wielu) różnych rang i typów. Te tablice są ukryte wewnątrz skomplikowanej struktury danych i chciałbym mieć funkcję pochłaniacza, który wykonuje następujące czynności:Przeciążenie funkcji związanej z typem w Fortran 2003

a => T%get(data_id) 

gdzie „a” jest wskaźnik na tablicy danego typu i data_id jest liczbą całkowitą, która jest używane do znajdowania danych w strukturze danych. Robię to przez przeciążanie wielu funkcji "get_thistype()" pod ogólną nazwą.

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

Działa to, jeśli procedury get_thistype() są podprocedury, ale nie, jeśli są napisane jako funkcje. Oznacza to, że mój kod wygląda następująco:

CALL T%get(a,data_id) 

który uważam za mniej czytelny. Czy istnieje sposób na przeciążenie funkcji, które mają tę samą listę argumentów, ale różne typy zwracane? lub czy muszę użyć do tego podprogramów?

+1

Myślę, że kompilatorowi trudno byłoby znaleźć właściwą funkcję opartą wyłącznie na typach zwracanych, więc prawdopodobnie nie jest to możliwe. Po prostu korzystałbym z podprogramów. – bdforbes

Odpowiedz

5

Gdy instrukcja przypisania (wskaźnik) zostanie wykonana w Fortran, prawa strona zawsze zostanie w pełni oceniona przed dokonaniem przypisania. Dzieje się tak niezależnie od lewej strony, więc absolutnie nie ma mowy, aby LHS wpłynęło na wynik oceny RHS. Tak po prostu zaprojektowano język.

+0

Cholera ... Ale dzięki! – calys

0

Właśnie natknąłem się ten post, więc z korzyścią dla każdego, to zobaczyć w przyszłości:

Jeśli dobrze rozumiem pytanie, można to osiągnąć poprzez przeciążenie operatora przypisania. Przykład:

plik 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 

plik testowy kierowca 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 

wyjściowa:

  1   2 
    1.000000  2.000000  3.000000  

Nadzieja to pomaga.

Powiązane problemy