2016-08-29 4 views
1

Ich kämpfe mit einem Code, den ich von einer anderen Person bekam. Er verwendet Module, um Arrays zu versorgen, die von der Hauptroutine benötigt werden. Was ich brauche, ist ein Array mit Zahlen von 500 bis 3500.Fortran: Wie man Werte in einem Modul zuweist

Er tat dies durch

INTEGER :: i 
REAL :: myArray(3001) 

DATA (myArray(i),i=1,100)/& 
500., 501., 502., 503., [...] 599./ 

DATA (myArray(i),i=101,200)/& 
600., 601., [...], 699./ 

[...] 

DATA (myArray(i),i=2901,3001)/& 
[...] 3498., 3499., 3500./ 

mir jetzt schreibe dies scheint sehr kompliziert! Außerdem muss myArray Ganzzahlen enthalten, aber natürlich möchte ich nicht alle diese Punkte entfernen.

Also zuerst habe ich versucht, dies:

Do i=1,3001 
    myArray(i) = i+499 
End Do 

Aber ich bekomme

"Fehler # 6274: Diese Aussage muss erscheinen nicht in der Spezifikation Teil eines Moduls"

Was mache ich falsch?

+0

Wenn Sie keine explizite Initialisierung haben wollen (im Sinne von "zur Kompilierzeit", also mit ausführbaren Anweisungen) dann die Antworten in [diese andere Frage] (http://stackoverflow.com/q/30073737) sich bewerben. Aber wirklich, ein [Array-Konstruktor] (http://stackoverflow.com/documentation/fortran/996/arrays/6858/array-constructors#t=201608291552201114144) mit impliziert tun, um ein explizit initialisiertes Array dieses Aussehens zu bekommen, ist kein Problem . – francescalus

Antwort

1

Der Fehler ist ziemlich erklärend. Sie können keine Berechnungen in einem Modul durchführen. Ein Modul dient zum Hosten von Variablendeklarationen und Subroutinenschnittstellen. Sie haben zwei Möglichkeiten:

  • einfach die Art erklären und die Dimension des Arrays in dem Modul und initialisieren Sie es in Ihrem Hauptprogramm (das Modul verwendet wird) mit der Schleife Sie vorgeschlagen haben.

  • Oder wie von @francescalus gezeigt, können Sie einen Array-Konstruktor direkt während der Deklaration im Modul verwenden. Etwas wie dieses: [(i, i=500, 3500)]

2

Sie benötigen eine implizite do-Schleife. Dies kompiliert und läuft gut

MODULE module1 

    INTEGER :: i 
    REAL :: myArray(3001) = (/ (i, i=500, 3500) /) 

END MODULE 

Das Format ist

(/ (exp1, var=start, end) /) 

oder

(/ (exp1, var=start, end, step) /) 

oder

(/ (exp1, expr2, .., var=start, end, step) /) 

Siehe https://web.stanford.edu/class/me200c/tutorial_90/07_arrays.html

+5

Erwähnenswert ist, dass modernere Fortran-Standards (2003, wenn ich mich richtig erinnere) "[' und ']' anstelle von '(/' und '/)' erlauben. –

+0

Danke. Sie können meinen archaischen Stil von den All-Caps-Keywords unterscheiden. Irgendwo in der Nähe von F95 wurde es üblich, Kleinbuchstaben zu verwenden, und ich denke, ich habe das Memo verpasst. – ja72

+0

Ich versuche, eine Referenz für die verschiedenen Möglichkeiten zu finden, Arrays in F03 und später zu initialisieren. Es ist schwer zu finden. Abschnitt 3.16 von ftp://ftp.nag.co.uk/sc22wg5/n1551-n1600/n1579.pdf ist das Beste, was ich tun könnte. – ja72

Verwandte Themen