Variable Größe von arrays in Fortran, ohne Allocate()
Gibt es eine Möglichkeit zu erstellen, die variable Größe der arrays in Fortran auf dem Stapel? Allocate() funktioniert bei mir nicht, weil es Orte, die das array auf dem heap. Dies kann dazu führen, Probleme mit der Parallelisierung (siehe meine andere Frage:
OpenMP: eine schlechte Leistung heap-arrays (stack arrays funktionieren) ). Natürlich, einige smart memory management geben würde, einen Weg um das problem, aber die Speicherverwaltung in Fortran albern klingt.
Grundsätzlich, ich bin auf der Suche nach einem Fortran-Entsprechung der folgende in C:
scanf("%d", N);
int myarray[N];
Erneut wiederhole: ich will NICHT
Integer, PARAMETER :: N=100
Integer, Dimension(N) :: myarray
denn diese bestimmt die array-Größe zur compile-Zeit. Weder möchte ich
Integer, Dimension(:), Allocatable :: myarray
read(*,*) N
Allocate(myarray(1:N))
weil es Orte, die das array auf dem heap.
Hilfe sehr geschätzt. Ich war sehr zufrieden mit Belegbar arrays bis zu meiner letzten Begegnung mit dem problem in der Frage, die oben zitiert werden. Wenn es eine negative Antwort auf diese Frage wäre ich sehr dankbar, ein link auf die Quelle.
Edit: siehe Kommentar zu M. S. B. ' s Antwort. Ein eleganter Weg, dies zu tun, ist erst möglich geworden, in Fortran 2008, und es ist getan in einer block
konstruieren.
InformationsquelleAutor der Frage drlemon | 2011-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fortran automatisch erstellen kann arrays nur mit Erklärungen Eintrag zu Unterprogrammen, wie lange, wie die Abmessungen sind bekannt, die zur Laufzeit ... dies erfordert nicht die Dimensionen erklärt werden parameter-Attribut, Sie kann Argumente, wie z.B.,
gültig ist. Warum also nicht entscheiden, Ihre Größe "N" im Hauptmenü des Programms, oder irgendein Unterprogramm, dann rufen Sie eine andere Unterroutine weiter. Wahrscheinlich mit diesem Ansatz wird das array auf dem stack. @Eriktous schrieb, der Fortran-Sprachstandard nicht angeben, dieses Verhalten. Einige Compiler-Schalter lokalen arrays auf dem heap, Vergangenheit einer bestimmten Größe. Einige Compiler bieten Optionen, um dieses Verhalten zu Steuern. Sie, große arrays auf dem heap würde wahrscheinlich überschrieben werden, mit rekursiven oder OpenMP.
Du kannst auch eine belegbar array als ein Tatsächliches argument zu einer subroutine ohne die dummy-argument der subroutine erklärt wird, wie belegbar. Die kann nicht helfen, mit Ihren Anliegen, weil Sie das ursprüngliche array wird immer noch wahrscheinlich ist, werden auf dem heap.
InformationsquelleAutor der Antwort M. S. B.
Fortran-standard hat kein Konzept von stack und heap, also die Umsetzung (d.h. compiler) abhängig. Auf der Suche in den docs für z.B. gfortran, es hat eine option
Anderen Compilern kann haben ähnliche Optionen. Vielleicht das tut, was Sie wollen.
InformationsquelleAutor der Antwort eriktous