Array der abgeleitete Typ: wählen Sie den Eintrag

Derzeit in meinem code habe ich ein 2D-array

integer, allocatable :: elements(:,:)

und definiert einige Konstanten

integer, parameter :: TYP = 1
integer, parameter :: WIDTH = 2
integer, parameter :: HEIGHT = 3
! ...
integer, parameter :: NUM_ENTRIES = 10

und weisen so etwas wie

allocate(elements(NUM_ENTRIES,10000))

also ich kann auf Elemente wie

write(*,*) elements(WIDTH,100) ! gives the width of the 100th element

Nun möchte ich nicht nur integer, sondern eine Mischung verschiedener Arten für jedes element.
So definiere ich einen abgeleiteten Typ

type Element
    logical active
    integer type
    real width
    ! etc
end type

und verwenden Sie ein array von Elementen

type(Element), allocatable :: elements(:)

Mit dem 2d-array-version, die ich nennen könnte, eine Unterroutine, die darüber informiert, welcher Eintrag zu benutzen.
E. g.

subroutine find_average(entry, avg)
    integer, intent(in) :: entry   
    real, intent(out) :: avg
    integer i, 
    real s

    s = 0
    do i = lbound(elements,1), ubound(elements,1)
        if (elements(TYP,i) .gt. 0) s = s + elements(entry,i)
    end do
    avg = s/(ubound(elements,1)-lbound(elements,1))
end subroutine       

So, ich könnte call find_average(HEIGHT) zu finden, die Durchschnittliche Höhe oder pass WIDTH zu bekommen, die Durchschnittliche Breite.
(Und meine Unterprogramme tun weitergehende Dinge als die Suche nach der durchschnittlichen Höhe oder Breite, das ist nur ein Beispiel.)

Frage: Wie kann ich verschiedene Typen (wie bei den abgeleiteten Typ), aber auch die Wiederverwendung meine Funktionen zum arbeiten mit verschiedenen Einträgen (wie im Beispiel-Unterroutine)?

InformationsquelleAutor Matthias 009 | 2012-03-23
Schreibe einen Kommentar