Fortran-pointers

提供:Dev Guides
移動先:案内検索

Fortran-ポインター

ほとんどのプログラミング言語では、ポインター変数はオブジェクトのメモリアドレスを格納します。 ただし、Fortranでは、ポインターはメモリアドレスを格納するだけでなく、より多くの機能を持つデータオブジェクトです。 タイプ、ランク、エクステント、メモリアドレスなど、特定のオブジェクトに関する詳細情報が含まれています。

ポインターは、割り当てまたはポインターの割り当てによってターゲットに関連付けられます。

ポインター変数の宣言

ポインター変数は、ポインター属性で宣言されます。

次の例は、ポインタ変数の宣言を示しています-

integer, pointer :: p1 ! pointer to integer
real, pointer, dimension (:) :: pra ! pointer to 1-dim real array
real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array

ポインタが指すことができます-

  • 動的に割り当てられたメモリの領域。
  • target 属性を持つ、ポインターと同じタイプのデータオブジェクト。

ポインターにスペースを割り当てる

*allocate* ステートメントを使用すると、ポインターオブジェクトにスペースを割り当てることができます。 たとえば-
program pointerExample
implicit none

   integer, pointer :: p1
   allocate(p1)

   p1 = 1
   Print *, p1

   p1 = p1 + 4
   Print *, p1

end program pointerExample

上記のコードをコンパイルして実行すると、次の結果が生成されます-

1
5
*deallocate* ステートメントが不要になったら、割り当てられたストレージスペースを空にし、未使用および使用不可のメモリスペースの蓄積を回避する必要があります。

ターゲットと関連付け

ターゲットは別の通常の変数で、スペースが確保されています。 ターゲット変数は target 属性で宣言する必要があります。

関連演算子(⇒)を使用して、ポインター変数をターゲット変数に関連付けます。

概念を実証するために、前の例を書き換えましょう-

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1

   p1=>t1
   p1 = 1

   Print *, p1
   Print *, t1

   p1 = p1 + 4

   Print *, p1
   Print *, t1

   t1 = 8

   Print *, p1
   Print *, t1

end program pointerExample

上記のコードをコンパイルして実行すると、次の結果が生成されます-

1
1
5
5
8
8

ポインタは-

  • 未定義
  • 関連する
  • 分離

上記のプログラムでは、⇒演算子を使用して、ポインターp1をターゲットt1に*関連付け*ています。 関連付けられた関数は、ポインターの関連付けステータスをテストします。

*nullify* ステートメントは、ポインターをターゲットから分離します。

同じターゲットを指すポインターが複数存在する可能性があるため、Nullifyはターゲットを空にしません。 ただし、ポインターを空にすると、無効化も暗示されます。

例1

次の例は、概念を示しています-

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1
   integer, target :: t2

   p1=>t1
   p1 = 1

   Print *, p1
   Print *, t1

   p1 = p1 + 4
   Print *, p1
   Print *, t1

   t1 = 8
   Print *, p1
   Print *, t1

   nullify(p1)
   Print *, t1

   p1=>t2
   Print *, associated(p1)
   Print*, associated(p1, t1)
   Print*, associated(p1, t2)

   !what is the value of p1 at present
   Print *, p1
   Print *, t2

   p1 = 10
   Print *, p1
   Print *, t2

end program pointerExample

上記のコードをコンパイルして実行すると、次の結果が生成されます-

1
1
5
5
8
8
8
T
F
T
0
0
10
10

コードを実行するたびに、メモリアドレスが異なることに注意してください。

例2

program pointerExample
implicit none

   integer, pointer :: a, b
   integer, target :: t
   integer :: n

   t = 1
   a => t
   t = 2
   b => t
   n = a + b

   Print *, a, b, t, n

end program pointerExample

上記のコードをコンパイルして実行すると、次の結果が生成されます-

2  2  2  4