1

次の目標を達成したいと考えています。

自己定義型データ (たとえば A) の最初の要素のポインターを使用して、A を参照します。

次のコードのプロトタイプを作成しました。

program test

    implicit none

    type foo
        integer i
        integer j
    end type foo

    type(foo), target :: a
    type(foo) b
    integer, pointer :: ai

    a%i = 1
    a%j = 2

    ai => a%i

    print *, "Address of a is", loc(a)

    b = transfer(ai, b)

    print *, "The values of a are:", a%i, a%j

    print *, "Address of b is", loc(b)

    print *, "The values of b are:", b%i, b%j

end program test

の値はbと等しいはずですaが、コンピューターで次のような結果が得られました。

Address of a is      140736918227392
The values of a are:           1           2
Address of b is      140736918227376
The values of b are:           1           0

の値はb%jとは異なりa%jます。なにが問題ですか?

前もって感謝します!

編集:私の目的は、定義されたタイプ(たとえば、 )をユーザーから隠し、ユーザーが(配列などの)foo最初の部分にのみアクセスできるようにすることです。fooユーザーがその配列を提供すると、残りの部分を取得できますfoo。一種のカプセル化です。ユーザーは「%」の入力から解放されます。

4

2 に答える 2

2

追加するだけで、何

ai => a%i
b = transfer(ai, b)

は、C に翻訳すると、という意味になります。

それは

b = (foo)(a->i)

私のCの記憶が私をだまさないなら。したがって、実際には整数を foo 型に変換しています。

--編集-- モジュールのユーザーには表示されない構造 (派生型) 内に多くのプライベート コンポーネントを含める ことができますが、それらをモジュール内で使用することはできます。ユーザーは、モジュールで定義されたプロシージャを使用して、プライベート エンティティと対話できます。新しいコンパイラでは、C++ のようにメソッド (型バインド プロシージャ) やその他の OOP を使用することもできます。

module mod
  type foo
    private
    integer,public :: i
    integer        :: j  !is private!
  end type

end module mod

program p

  use mod

  type(foo) :: a,b

  b%i = 1
  !intrinsic assignment should work, even if you don't see a%j and b%j
  !you can also override the assignment yourself
  a = b

  write(*,*) a%i

end program p
于 2012-09-26T14:04:47.617 に答える