3

FORTRAN 2003 で派生データ型のエントリ アクセス演算子 []、()、または {} をオーバーロードできますか? 次の例では、派生データ型「custom」のアクセス スキームを定義します。

type custom
   integer, dimension(:), allocatable :: a
end type custom

type(custom) :: t

! after some initialization 
! .....
! .....
! .....
!
t%a( (/ 1, 2, 5 /) ) ! return entries located in positions 1, 2, and 5
t{ (/ 1, 2, 5 /) }   ! ?????? I want to define what stuff it should return 

どうやってやるの?

アップデート:

配列「t%a」を直接使用したくないことに注意してください。その上で従来のサブ配列操作を行います。代わりに、データ型「カスタム」の配列操作を再定義して、t{'first'} が t%a または t%a(1) の最初のエントリのポインターを返すようにしたいので、

t['first']= 18 

また

print *, t['first']. 

また、追加のオーバーロードを使用して、t[1] = 18 のような機能を t['first'] = 18 のように機能させたいと考えています。

4

1 に答える 1

4

これはむしろ、「返品」の意味に依存します。

それ自体で提供された例

t%a([1,2,5])   ! Using syntax offered by Fortran 2003

何も返さない: それはsubobjectです。そのサブオブジェクトへの参照を使用して、さまざまなことを行うことができます。

print *, t%a([1,2,5])
t%a([1,2,5]) = 27
t%a([1,2,5]) = sin(real(t%a([1,2,5])))

しかし、「戻る」という概念はまだありません。決定的に重要なのは、後で見るように、これらは表現ではありません。

質問に来て、何かを意味することができt[]ますt()t{}、答えは単に「いいえ」です。* たとえば、次のように言うことができます。

t[1,2,5] = 1

意味する

t%a[1,2,5] = 1

しかし、それは考慮すべきことではありません。

のような式を作成することができます。

print *, t%ref([1,2,5])

しかし、私たちはかなり定義不可能な領域にいます。

ただし、ポインターについて言及したように、さらに言いたいことがあります。推奨される構文t[1]ort["first"]は利用できませんが、タイプ バインド プロシージャのオプションはまだあります。たとえば、関数呼び出しt%ref("first")は の最初の要素へのポインターを返すことができる場合がありますt%a。たとえば、次のt%ref(1)ようになります

module reference

  implicit none

  type custom
     integer, dimension(:), allocatable :: a
   contains
     procedure ref
  end type custom

contains

  function ref(t, idx)
    class(custom), target, intent(in) :: t
    integer, intent(in) :: idx
    integer, pointer :: ref

    ref => t%a(idx)
  end function ref

end module reference

  use reference
  implicit none

  type(custom), target :: t
  integer, pointer :: b

  t%a = [1, 2, 3, 4, 5]

  print *, t%a
  b => t%ref(1)  ! Fortran 2008 allows direct assignment
  b = 8          ! but compiler support is very limited.
  print *, t%a

end

必要に応じて、 (etc.) が受け入れられるrefように一般的なものにすることができます。t%ref("first")


*tここがスカラーであるという事実に基づいています。ただし、Vladimir F がコメントで述べたように、()意味の[]あることをする可能性があります。1 つ目は配列に関するもので、2 つ目は共同配列に関するものです。したがって、構文が問題になりますが、この回答は構文よりもメカニズムに注目しています。

于 2014-08-30T23:50:49.257 に答える