6

Fortran 90 では、派生データ型に名前付き定数を使用できないようです。これは本当ですか?次のコードは機能しません。

program my_prog
implicit none
   type :: my_type
      integer, parameter :: a = 1
      real(kind(1.d0))   :: b
   end type my_type
   type (my_type) :: complex_type
end program my_prog

コンパイラは、パラメーター ステートメントは派生型の定義では許可されていないと述べています。

parameterキーワードを削除すると、すべて正常に動作します。しかし、コンポーネントが他の場所で変更されていないことを確認するにはどうすればよいaでしょうか?

4

4 に答える 4

5

定数 (パラメーター) を型ではなく、メイン プログラムのローカル エンティティにします。定数の識別子の可視性とスコープをさらに制御したい場合は、定数をモジュールに入れます。

于 2013-10-06T23:24:19.120 に答える
5

規格によると、それは許可されていません。コンポーネント属性指定子pointerdimensionFortran 90/95 の場合 (セクション 4.4.1)、Fortran allocatable2003 の場合 (セクション 4.5.3)、およびcodimensionFortran contiguous2008 の場合 (セクション 4.5.4.1) のみです。

ドキュメントはこちらから入手できます。

指定子で同様の問題が発生しましたがtarget、これも許可されていません。

編集:privateコンポーネントを試してみませんか?

module typedef
  type :: my_type
    integer, private :: a_int = 1
    real(kind(1.d0)) :: b
  contains
    procedure :: a
  end type my_type

contains
  function a(complex_type)
    class(my_type),intent(in) :: complex_type
    integer :: a
    a = complex_type%a_int
  end function
end module

program my_prog
  use typedef
  implicit none

  type (my_type) :: complex_type

  complex_type%b = 2.d0 ! This should work
  write(*,*) complex_type%a(), complex_type%b

!  complex_type%a_int = 3    ! This should fail

end program my_prog
于 2013-10-07T09:27:12.357 に答える
3

問題は、なぜこれをやりたいのかということです。

1000 個の値の配列を作成したいとしますmy_type。その結果、 の値はa1000 回保存されます。これは、約 4kb のメモリを浪費します ( と仮定int4)。より良い方法は、対応するモジュールでパラメーターを定義することです。

ところで、Clerman と Spector による最新の Fortranという本では、ルール番号 133 で、すべての派生型を独自のモジュールで定義する必要があると述べています。これは、そのような定数にとって素晴らしい場所です。

于 2013-10-07T12:01:20.693 に答える
1

これをプライベートとして定義し、get() 関数を生成できますが、set() 関数は生成できません。このようにして、データは適切にカプセル化されます。

于 2014-07-01T20:25:55.243 に答える