1

サブルーチン (または関数) で派生データ型を計算したい。サブルーチンの引数で変数を参照するにはどうすればよいですか?

ここまでは、オブジェクト全体を参照してから、サブルーチン内の変数を参照することで目的を達成できました。サブルーチンの引数で変数 myObj%var のみを参照する方法はありますか?

PROGRAM test

    TYPE obj
        INTEGER :: var
    END TYPE obj

    TYPE (obj) :: myObj
    CALL set(myObj)
    PRINT*, myObj%var

        CONTAINS

    SUBROUTINE set(myObj)
        TYPE (obj) :: myObj
        myObj%var = 5
    END SUBROUTINE set

END PROGRAM test
4

2 に答える 2

2

あなたは単に書くことができます

SUBROUTINE set(an_int)
    integer, intent(inout) :: an_int
    an_int = 5
END SUBROUTINE set

そして、次のようにサブルーチンを呼び出します。

CALL set(myObj%var)

コンポーネントを派生型にパッケージ化し、それらをアンパックしてプロシージャに渡すのはひねくれているという私の意見は単なる意見であり、無視してかまいません。個人的には、次のようなコードのより根本的な書き直しを行います。ただし、これは 2003 標準で導入されたいくつかの機能を使用していることに注意してください。ただし、これらは最も広く使用されているコンパイラの現在のエディションで実装されています。

MODULE mytype

  IMPLICIT NONE

  TYPE obj
     INTEGER, PRIVATE :: var
   CONTAINS
     PROCEDURE, PASS :: get_var
     PROCEDURE, PASS :: set_var
  END TYPE obj

CONTAINS

  SUBROUTINE set_var(this,an_int)
    CLASS(obj), INTENT(inout) :: this
    INTEGER, INTENT(in) :: an_int
    this%var = an_int
  END SUBROUTINE set_var

  INTEGER FUNCTION get_var(this)
    CLASS(obj), INTENT(inout) :: this
    get_var = this%var
  END FUNCTION get_var

END MODULE mytype


PROGRAM test

  USE mytype
  IMPLICIT NONE 

  TYPE (obj) :: myObj
  CALL myobj%set_var(12)
  PRINT*, myObj%get_var()

END PROGRAM test
于 2013-07-09T08:35:53.717 に答える