2012-03-12 15 views
5

(çok) farklı sıra ve türlerde veri dizileri içeren bir Fortran türetilmiş T'ye sahibim. Bu diziler, bir karmaşık veri yapısı içinde gizli ve bu bir alıcı işlevi istiyorum aşağıdaki işlemleri yapar:Fortran 2003'te türüne bağlı işlev aşırı yükleme

, "a", belirli bir tipteki bir dizi gösterici ve data_id olan bir tam sayı olduğu
a => T%get(data_id) 

Veri yapısında veriyi bulmak için kullanılır. Bunu, genel bir ad altında birçok "get_thistype()" işlevini aşırı yükleyerek yapıyorum.

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

Bu get_thistype() rutinleri altyordamlar ise çalışır, ancak işlevleri olarak yazılır değilse. Bu benim kodumun daha az okunabilir bulduğum anlamına gelir:

. Aynı argüman listesi olan ancak farklı dönüş türlerine sahip işlevleri aşırı yükleme yolu var mı? ya da bunun için alt rutinleri kullanmalı mıyım?

+1

Derleyicinin yalnızca geri dönüş türlerine göre doğru işlevi bulmasının zor olacağını düşünüyorum, bu yüzden muhtemelen imkansız. Altprogramları kullanırdım. – bdforbes

cevap

5

Bir (işaretçi) atama bildirimi fortran'da yürütüldüğünde, görev tamamlanmadan önce sağ taraf her zaman tamamen değerlendirilir. Bu, sol taraftan bağımsız olarak gerçekleşir, bu yüzden LHS'nin RHS'nin değerlendirmesinin sonucunu etkilemesinin hiçbir yolu yoktur. Bu sadece dilin tasarlandığı yoldur. Ben doğru soruyu anlamak

, sen atama operatörü aşırı gerçekleştirebilirsiniz: kimseye faydası gelecekte bu bkz öylesine

+0

Lanet olsun ... Ama yine de teşekkürler! – calys

0

Sadece bu yazı geldi. Örnek:

dosya 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 

test sürücüsü dosya 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 

Çıktı: Bu yardımcı olur

  1   2 
    1.000000  2.000000  3.000000  

Umut.