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