5

ユーザー定義型がありvectorます。別のタイプでは、割り当て可能なベクトルの配列があります。この割り当て可能な配列から単一のベクトルへのポインターが必要です。だから私はこれをするだろうと思った:

type another_type
  type(vector),allocatable,target::my_vectors(:)
end type

type(vector),pointer::pointed_vec

しかし、コンパイルすると、コンパイラは次のように不平を言います。

This attribute specification is not valid for a component definition statement.

割り付け可能な配列から 1 つの項目へのポインターを取得できますか? 出来ますか?

4

2 に答える 2

5

変数または派生型の実際のインスタンスのみがTARGET属性を持つことができます。したがって、2 番目の型定義のアロケータブルをターゲットにすることはできません。これは、型がどのように見えるべきかの単なる説明であり、必要に応じてテンプレートであるためです。

ただし、型の実際のインスタンスにTARGET属性を指定してから、適切に宣言された Fortran ポインターを使用して、その構成要素のいずれかを指すことができます。

編集済み: 代わりに、おそらくあなたが求めているのは、型のベクトル配列にPOINTER属性のみを与えることです。これにより、暗黙的に正当なポインティになり、メモリの割り当てに使用される可能性があります。ポインタを使用してメモリを割り当てた後は、ポインタを再割り当てしないようにする必要があります (v以下の例では)。これは、リークが発生するためです。

PROGRAM so_pointtype

  IMPLICIT NONE

  TYPE vec
    INTEGER :: x = 2, y = 3
  END TYPE vec

  TYPE foo
    TYPE(vec),POINTER :: v(:)
  END TYPE foo

  TYPE(foo) :: z
  TYPE(vec),DIMENSION(:),POINTER :: p2 => NULL()

  ALLOCATE(z%v(3))

  PRINT*,z%v(:)

  p2 => z%v(:)

  PRINT*,p2

END PROGRAM so_pointtype
于 2010-10-18T10:33:56.493 に答える
0

はい、割り当て可能な配列内の単一の項目を指すことができますが、配列my_vectorsはスカラーであり、allocatable属性を持つことはできません。たぶん、コンパイラエラーを引き起こしているのはその宣言です。gfortranを使用すると、コンパイル時のメッセージが表示されます。

  TYPE(vector),ALLOCATABLE,TARGET :: my_vectors
                                1
Error: Scalar object 'my_vectors' at (1) may not be ALLOCATABLE

として宣言してみてくださいmy_vectors(:)

于 2010-10-16T12:24:58.190 に答える