0

Ich muss ein Unterprogramm in Fortran 77 schreiben (ich verwende Intel Fortran), das die gemessenen Werte aus einer Textdatei liest und sie in einer Matrix speichert.Dynamisches Array in Fortran 77

Da die Anzahl der Messwerte immer variabel ist, muss ich die Matrix dynamisch zuordnen.

Ich weiß, dass die dynamische Zuweisung ist nur von Fortran 90 möglich, aber zu dieser Zeit hatten die Menschen die gleichen Probleme, so ist es auch möglich. Wie würden Sie fortfahren?

Ich möchte nicht zu viel Platz für die Matrix reservieren, weil die Methode für mich unpraktisch ist.

+0

http://stackoverflow.com/questions/3834985/dynamic-memory-allocation-in-fortran77 –

+0

Schreiben Sie nicht Fortran 77 im Jahr 2016, vor allem, wenn Sie dynamische Speicherzuweisung benötigen, ist es einfach nicht wert. Wenn Sie den alten Fortran 90 nicht verwenden können, ordnen Sie den Stoff in C zu und übergeben Sie ihn an die Fortran-Subroutinen. –

+1

Es gibt Gründe, FORTRAN 77 in Legacy-Systemen zu verwenden. Es gibt keinen Grund, FORTRAN 77 zu verwenden, wenn Sie Intel Fortran verwenden. –

Antwort

2

Wenn Sie wirklich auf Fortran 77 beschränkt sind, führen Sie keine dynamische Zuweisung durch. Erklären Sie stattdessen ein Array, das größer ist als das, was Sie wahrscheinlich benötigen, ohne dass es zu groß ist, um zu verhindern, dass das Programm auf Ihrem Zielsystem ausgeführt wird. Speichern Sie dann Ihre Werte in diesem großen Array, wobei Sie separat verfolgen, wie viele Elemente des großen Arrays Sie verwenden. Wenn die Auswahl der Array-Größe nicht groß genug ist, informieren Sie das Programm und beenden Sie es.

In Fortran 77 fanden die Benutzer die fehlende dynamische Zuweisung sehr restriktiv, weshalb sie oft auf nicht standardmäßige Spracherweiterungen zurückgriffen. Wenn Sie sich entscheiden, den Weg der Spracherweiterungen zu gehen, dann ist die beste Erweiterung für Fortran 77 in dieser Situation die zuweisbare Array-Funktion, die mit Fortran 90 eingeführt wurde. Ich denke, es ist fair zu sagen, dass alle aktiv gepflegten Compiler dies können handle Fortran 77 behandelt auch zuordnende Fortran 90-Arrays (und dann einige).

+0

Danke IanH. Ich habe schon gedacht, dass es einfacher ist, statisch zuzuteilen. Ich werde beide Wege versuchen, aber neige zur statischen. – ingenium

0

Wie viele Leute darauf hingewiesen haben, müssen Sie sich nicht an Fortran77 halten, auch wenn vieles von dem, was bereits geschrieben wurde, Fortran77 kompatibel ist. Selbst die wenigen Funktionen, die in Fortran 95 See Wikipedia for a list gelöscht wurden, funktionieren wahrscheinlich noch gut mit Ihrem Compiler, solange Sie in derselben Datei nicht von Fixed Form in Free Form wechseln.

Pre-F90, was Leute wahrscheinlich tun würden, ist Arrays zu deklarieren, die (hoffentlich) groß genug für jeden Anwendungsfall sind, dann verwenden Sie nur die ersten Elemente dieses Arrays.

Eine Sache, über die ich nicht sicher bin, aber die nützlich sein könnte, ist die Änderung des Umfangs. Kurzes Beispiel:

 subroutine main(n) 
      implicit none 
      integer n 
      integer a(n) 
      print*, "Please enter the ", n, " numbers" 
      read*, a 
      print*, "Sum is ", sum(a) 
     end subroutine main 

     program dynamic 
      implicit none 
      integer n 
      print*, "Enter size of array:" 
      read*, n 
      call main(n) 
     end program dynamic 

Ich bin neugierig zu wissen, ob diese Fortran77 gerecht werden. Ich weiß es ehrlich gesagt nicht. @francescalus hat mich davon überzeugt, dass es nicht ist.

+0

Für Ihren letzten Absatz: Es ist nicht F77. – francescalus

+0

Ich bekomme gemischte Nachrichten. Oracle scheint zu glauben, dass einstellbare lokale Arrays F77-konform sind: https://docs.oracle.com/cd/E19957-01/805-4939/z40007367199/index.html während andere Quellen behaupten, dass einstellbare Arrays nur Dummy-Argumente sein können, nicht lokale Arrays, z hier: https://www.obliquity.com/computer/fortran/procedure.html – chw21

+1

In der Oracle-Dokumentation beachten Sie das "lokale Array @". Das "@" bezeichnet eine nicht standardmäßige Erweiterung. – francescalus

Verwandte Themen