2016-08-29 18 views
1

私は別の人から得たコードに苦労しています。彼はモジュールを使用して、メインルーチンが必要とする配列を供給します。私は、必要なのはその Fortran:モジュールで値を割り当てる方法

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./ 

今、私には、これは非常に複雑なようだ

を書き込むことによって、500から3500彼がやった

に番号を持つ配列です!また、myArrayにIntegersを含める必要がありますが、もちろんこれらの点をすべて削除したくありません。

だから最初は、私はこの試みた:

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

しかし、私は

を取得し、 "エラー#6274:このステートメントは、モジュールの仕様部分 に表示されていなければなりません"

どうすればいいですか?

+0

明示的な初期化(「コンパイル時」の意味で、実行可能ステートメントを使用する)の意味がない場合は、[この他の質問](http://stackoverflow.com/q/30073737 )が適用されます。しかし、実際には、[配列のコンストラクタ](http://stackoverflow.com/documentation/fortran/996/arrays/6858/array-constructors#t=201608291552201114144)暗黙のうちに明示的に初期化された配列を取得するには問題はありません。 – francescalus

答えて

1

エラーは非常に説明的です。モジュールで計算を実行することはできません。モジュールは、変数宣言とサブルーチンインターフェイスをホストするように設計されています。

  • ジャストタイプとモジュールでの配列の次元を宣言し、あなたが示唆されているループで(モジュールを使用して)あなたのメインプログラムでそれを初期化する:2つのオプションがあります。

  • また、@francescalusによって指摘されているように、モジュールの宣言中に配列コンストラクタを直接使用できます。このようなもの:[(i, i=500, 3500)]

2

暗黙のdoループが必要です。これは細かい

MODULE module1 

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

END MODULE 

フォーマットは

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

または

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

または

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

で参照してください。コンパイルし、実行しますhttps://web.stanford.edu/class/me200c/tutorial_90/07_arrays.html

+5

より現代的なFortran標準(私が正しく思い出した場合の'03)は '(/'と '/)'の代わりに '['と ']を許していると言えるでしょう。 –

+0

ありがとうございます。私の古風なスタイルをall capsキーワードから教えてください。 F95の近くのどこかで小文字を使うのが標準になり、私はメモを忘れてしまったと思います。 – ja72

+0

私は、F03以降の配列を初期化するさまざまな方法のリファレンスを探しています。その種類の見つけるのは難しいです。 ftp://ftp.nag.co.uk/sc22wg5/n1551-n1600/n1579.pdfのセクション3.16は私ができる最高のものです。 – ja72

関連する問題