2

いくつかのレガシー コードを操作しているときに、次の Fortran 関数宣言を見つけました。以下のスニペットは、関数の宣言とパラメーターの宣言の両方を示しています。Fortran は大文字と小文字を区別しない言語だと思います。

 SUBROUTINE CLIP2G (fcut,TIME,NUMS,NUMG,CLIPG,CLIPGL,CLIPGR,MODE,PHZ)

      real fcut, TIME,
      integer NUMS, NUMG
      DIMENSION CLIPG(1)
      REAL clipgr(1),clipgl(1)
      INTEGER MODE
      LOGICAL PHZ

DIMENSION CLIPG(1)声明 の意味は何ですか?

ステートメントのかなり簡潔な説明へのリンクを見つけましたが、主に C/C++ プログラマーとして、概念を理解するのはやや難しいと感じています。REAL clipgr(1), clipgl(1)括弧が続くことに注意してください(1)。これは長さ = 1 の配列で、型はREALですか?

Stack Overflow には他にもいくつかのリンクがありますが、以下のリンク先の投稿にある C のような構文でも、意味がよくわかりません。

Fortran 関数の説明

おそらくステートメントDIMENSION CLIPG(1)と同等ですか?REAL CLIPG最も近い C 言語の同等物は何ですか?

4

1 に答える 1

6

DIMENSION変数が配列であることをコンパイラに示すために使用されます。この場合、1 つの要素の配列としてDIMENSION CLIPG(1)宣言します。CLIPGまた、暗黙的に beREALに型指定されるため、同等の宣言は次のようになります。

REAL CLIPG(1)

同等の C 構文は次のようになります。

..., float clipg[1], ...

これは、実際には 1 つの要素だけの配列であるとは限らないことに注意してください。CLIPGまた、さまざまなサイズの配列であることをコンパイラに説明する (非常に悪い) 方法としても使用できCLIPGます (たとえば、このサブルーチンを 5 つの要素の配列で 1 回呼び出し、次に 50000 要素の配列で再度呼び出すことができます)。要素が 1 つだけあると宣言されているため、コンパイラはそれが配列であることを認識しますが、実際の引数がより大きな配列である場合は、その末尾を超えてアクセスできます。これは非常に悪い習慣ですが、多くの非常に古い Fortran コードで使用されています。

FORTRAN 77 では、このような配列を記述する別の方法が提供されています。

REAL CLIPG(*)

また

DIMENSION CLIPG(*)

このような配列は、想定サイズ配列と呼ばれます。サイズ引き継ぎ配列として宣言できるのはダミーのルーチン引数のみであり、配列の最後の次元のみを省略できます。

DIMENSION CLIPG2D(10,*)

(しかしそうではないDIMENSION CLIPG2D(*,10)

これは、CLIPG2Dsomething x 10行列 (Fortran は行列を列ごとに格納する) であり、something異なる可能性があることを意味します。サイズ引き継ぎ配列が使用される場合は常に、省略された次元のサイズをルーチンに明示的に指定する必要があります。

C では、 または のいずれかを使用しfloat clipg[]ますfloat *clipg

于 2012-11-23T17:31:20.890 に答える