Fortran-arrays, Unterprogramme (sub-arrays)
Werde ich durch ein Fortran-code, und ein bisschen hat mich ein wenig verwirrt.
Es ist ein Unterprogramm, sagen
SUBROUTINE SSUB(X,...)
REAL*8 X(0:N1,1:N2,0:N3-1),...
...
RETURN
END
Die aufgerufen wird, in einem anderen Unterprogramm von:
CALL SSUB(W(0,1,0,1),...)
wo W ist eine "Arbeits-array'. Es scheint, dass Sie einen bestimmten Wert von W wird an den X, aber X ist so dimensioniert wie ein array. Was ist Los?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht ungewöhnlich idiom für das Unterprogramm arbeiten auf einem (rechteckigen in N-Dimensionen) Teilmenge des ursprünglichen Arrays.
Alle Parameter in Fortran (zumindest vor Fortran 90) werden per Referenz übergeben, so dass die eigentliche array-argument ist aufgelöst, von einem Speicherort im Arbeitsspeicher. Wählen Sie einen Speicherort innen der Speicherplatz für das ganze array und der subroutine manipuliert nur ein Teil des Arrays.
Größte Problem: müssen Sie sich bewusst sein, wie das array im Speicher angeordnet und wie Fortran ' s array-Indizierung Schema funktioniert. Fortran verwendet Spalte große Auswahl bestellen, das ist das Gegenteil Konvention von c. Betrachten Sie ein array mit 5x5 in der Größe (und index beide Richtungen von 0 zu machen, der Vergleich mit c einfacher). In beiden Sprachen 0,0 ist das erste element im Speicher. In c das nächste element im Speicher ist
[0][1]
aber in Fortran ist es(1,0)
. Dies wirkt sich auf die Indizes fallen Sie bei der Wahl eines Subraum: wenn das original-array mit A(i,j,k,l), und das Unterprogramm arbeitet an drei-dimensionaler Unterraum (wie in deinem Beispiel), in c funktioniert es aufAprime[i=constant][j][k][l]
, aber in Fortran arbeiten aufAprime(i,j,k,l=constant)
.Die andere Gefahr ist die wrap-around. Die Abmessungen der (sub)array im Unterprogramm müssen denen entsprechen, die in der aufrufenden routine, oder seltsame, merkwürdige Dinge passieren (denken Sie). Also, wenn Einem erklärt wird, von der Größe (0:4,0:5,0:6,0:7), und wir rufen Sie mit element
A(0,1,0,1)
die empfangsroutine ist frei, start der index jeder dimension, wo auch immer es sein mag, aber müssen die Größen(4,5,6)
oder anderes; aber das bedeutet, dass das Letzte element in der j-Richtung eigentlich umschlingt! Die Sache zu tun, über das nicht das Letzte element. Machen Sie sicher, dass das passiert, ist die Programmierer-job, und ist ein Schmerz in den Hintern. Kümmern. Viel Sorgfalt.Dieser nennt sich "Sequenz " Verein". In diesem Fall, was zu sein scheint ein scaler, ein element eines Arrays (tatsächliche argument im Aufrufer) mit einem zugeordneten array (implizit beim ersten element), die dummy-argument in die Unterroutine . Danach werden die Elemente des arrays verbunden sind, die durch die Lagerung um, bekannt als "Sequenz". Dies wurde in Fortran 77 und früher aus verschiedenen Gründen, die hier offenbar für einen Arbeitsbereich array-vielleicht die Programmierer tun Ihr eigenes memory-management. Dies ist aufbewahrt in Fortran >=90 für die rückwärts-Kompatibilität, aber IMO gehört nicht in neuem code.
in fortran werden Variablen übergeben-Adresse.
So
W(0,1,0,1)
ist Wert und Adresse. so im Grunde you passieren subarray abW(0,1,0,1)
.