0

配列を参照によってサブルーチンに渡す必要があります。このインタープリターの代わりに、マトリックスのコピーを作成します。また、MAIN のスタティック マトリックスは のままです{{0,0}{0,0}{0,0}}。Fortran では、デフォルトですべての変数が参照渡しであることを知っています。私は何を間違っていますか?

 PROGRAM LAB1
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    call newTriangle(pointsOfTriangle)
    call getTriangle(pointsOfTriangle)

    pause
  END

  SUBROUTINE newTriangle(pointsOfTrinagle)
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    Integer i

    do i=1,3
        print *,'enter x,y:'
        read *,pointsOfTriangle(1,i),pointsOfTriangle(2,i)
    end do

    do i=1,3
        print *,'x[', i,']=',pointsOfTriangle(1,i)
        print *,'y[', i,']=',pointsOfTriangle(2,i)
        print *,' '
    end do

  END

  SUBROUTINE getTriangle(pointsOfTriangle)
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    Integer i

    do i=1,3
        print *,'x[', i,']=',pointsOfTriangle(1,i)
        print *,'y[', i,']=',pointsOfTriangle(2,i)
        print *,' '
    end do

  END
4

2 に答える 2

1

コードをコンパイルし、途中で 10 行目のスペルミスを修正して実行しました。それはうまくいくようです。

あなたの「通訳者」が行列をコピーしたという証拠は何ですか? (あなたが用語を正しく使用していないと思うので、私はインタープリターという言葉を引用符で囲みました。)

Fortran ではすべての変数がデフォルトで参照渡しされていることを知っていると書いています。あなたは微妙に間違っています。Fortran 標準では、プロセッサー (「インタープリター」と呼ばれるものの標準的な用語であり、それ以上の意味) が参照によって引数を渡すことを要求していません。舞台裏では、プロセッサーは好きなことを自由に行うことができます。昔、一部のコンパイラーでは、引数が小さなエルフによって渡されていたと思います。それはさておき、私がこれまでに使用したほとんどの Fortran プロセッサ (および現在使用しているすべてのプロセッサ) は、デフォルトで引数を参照渡しするため、そうでないものがあるのは珍しいことだと思います。そのため、なぜあなたの製品にこの異常な機能があると考えているのかを知りたいのです. 使用しているコンパイラを教えていただくこともできます。

最後に、求められていないアドバイス: プログラムendステートメントをソース全体の最後に移動し、 pause9 行目のステートメントの後に、単語のみを含む行を挿入しますcontains。この再配置により、サブルーチンがプログラムの内部になり、コンパイラはコードを生成して、それらが正しく呼び出されるようにします-正しい型の正しい数の引数で、そのようなこと。また、サブルーチン定義を終了するステートメントにsubroutine単語を付ける必要があります。end

于 2013-02-18T10:09:00.417 に答える
-1

私の講師は共通ブロックの使用を勧めました。構文 COMMON/タグ/変数名. これは C/C++ のグローバル変数に似ていますが、どの関数とサブルーチンがそこで参照できるかを指定するため、より安全です。

そして、一般的なブロックの 1 つの機能。

COMMON/vertex/x1,y1,x2,y2,x3,y3 

配列変数は一貫しているため、これは機能します。

  PROGRAM LAB1
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    COMMON/vertex/pointsOfTriangle
    call newTriangle(pointsOfTriangle)
    call getTriangle(pointsOfTriangle)

    pause
  END

  SUBROUTINE getTriangle
    IMPLICIT NONE
    Real pointsOfTriangle(2,3)
    COMMON/vertex/pointsOfTriangle
    Integer i

    do i=1,3
        print *,'x[', i,']=',pointsOfTriangle(1,i)
        print *,'y[', i,']=',pointsOfTriangle(2,i)
        print *,' '
    end do

  END
于 2013-02-18T17:28:40.727 に答える