2017-10-11 54 views
2

現在、いくつかのレガシーFortranコードの翻訳に取り組んでおり、コード内の特定の行を理解するのに苦労しています。コンパイラはまた、この行が奇妙であると判断し、エラーをスローします。私が理解するところでは、1から9までのシーケンスを1ずつ増やして配列を初期化しようとしており、この配列を列の主形式で配列行列に埋めています。Fortranで配列を初期化する

program arrayProg 

    integer :: matrix(3,3), i , j !two dimensional real array 

    matrix = reshape((/1:9:1/), (/3,3/)) 

end program arrayProg 

この構文はfortranでも受け入れられますか? (これは従来のコードから来ているためです) 私はその行が何を誤解していますか?

+0

コンパイラはどのようなエラーを検出しましたか?どのコンパイラ? [ask]と[mcve]を参照してください、あなたは常にあなたが持っているすべての情報を提供する必要があります。エロメサージュは私たちにとって非常に重要です。構文が正しくありません。 –

答えて

4

非標準の拡張機能を実装していない限り、構文は正しくなく、Fortranコンパイラでコンパイルできません。

A colon-separated triplet (instead of an implied-DO loop) to specify a range of values and a stride; for example, the following two array constructors are equivalent: 
1  INTEGER D(3) 
2  D = (/1:5:2/)    ! Triplet form - also [1:5:2] 
3  D = (/(I, I=1, 5, 2)/)  ! implied-DO loop form 

https://software.intel.com/en-us/node/678554から1だけの変化よりも黙示を

(/ (i, i=1,9) /) 

ようリシェイプをループを行う使用する標準的な方法でシーケンスを生成するには:

インテルFortranは、これが受け入れあなたが推測したように、1D配列を2次元配列に変換します。

+3

ところで、誰かが非標準の拡張機能、特にDEC拡張機能のような醜いものを新しいコードで使うことをお勧めするたびに、このような状況について考えてみてください。誰かがコードを継承し、別のコンパイラを手に入れてしまい、少なくとも混乱し、コードを標準形式に書き換えるPIAになります。あなたは「私はいつもIntelを使っているのでポータブルです、それはナンセンスです」と言うことはできません。 –

+0

合意しましたが、この場合、現代のFortranは、配列インデックスでしか使用できない整数シーケンス生成のための完全に使用可能な構文を持っているのが本当に心配です。このアプローチを使用して整数シーケンスを作成するのは当然ですが、暗黙のDOループを使用して言語標準内にとどまるようにすることを強く求めています(翻訳ではこれに噛まれてしまいました)。結果を使用するつもりがない場合でも、複数のコンパイラの下で実行できます。非標準の拡張機能をすばやく通知します。 – arclight