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)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die array-Gehäuse, anstatt die im arguments-array und den index i, die Sie nicht passieren konnten, in der einzigen argument-array (ich). Wenn Sie wechseln, um mit den abgeleiteten Typ, ähnlich wie Sie passieren konnten, in variable_of_type % element anstatt in die gesamte variable_of_type und irgendwie anweisen, das Verfahren, das Element soll es sich zu arbeiten. Wenn der code benötigt, um verschiedene für die verschiedenen Arten von Elementen (z.B. logical, integer, real), dann könnten Sie schreiben bestimmte Verfahren für jeden, aber rufen Sie dann mit einem gemeinsamen Namen, über eine generische Schnittstelle zu blockieren. Der compiler muß in der Lage sein, zu unterscheiden, die Verfahren der generischen Schnittstelle block durch einige charakteristische die Argumente, die hier Ihre Art. Für ein code-Beispiel, in dem die Besonderheit ist array-Rang sehen wie schreibt wrapper für 'allocate'
EDIT: Beispiel-code. nicht das tun, was Sie wollen?
entry
wird immer zeigen Sie auf einen Eintrag vom gleichen Typ (sagen immerreal
), also zum Glück dieses problem werde ich nicht haben. Aber die ersten beiden Sätze sind mir nicht klar. Für die array-Fall, meinst du ich könnte die Scheibeelements(WIDTH,:)
an die Funktion? Für den abgeleiteten Typ Fall, ich will nicht ein element, brauche ich alle Elemente. Könnte man anfügen, eine modifizierte version meiner Beispiel-Funktion, damit ich verstehe, was du meinst? Dank(:)
imtype_array(:)%member
gibt ein array mit den Typ des Mitglieds. Schön! Vielen Dank für die Hilfe!