3

タイトルにあるように、関数から取得したポインターを介してアクセスするデータを直接変更したいと考えています。割り当て (=) の左側にある関数によって返される参照を持つことは、C++ では問題ありませんが、次の Fortran の最小限の例ではエラーが発生します。

module test_mod
  implicit none

  integer, target :: a=1, b=2, c=3 ! some member variables

contains

  function get(i)
    integer, pointer :: get
    integer, intent(in) :: i

    select case (i)
      case (1)
        get => a
      case (2)
        get => b
      case (3)
        get => c
    end select 
  end function get

end module test_mod

program test
  use test_mod
  implicit none
  integer, pointer :: i_p

  !> prints out 1 2 3
  print*, get(1), get(2), get(3)

  !> this is what I want but I get the error
  !> Error: 'get' at (1) is not a variable
  get(2) = 5

  !> this works but is not what I want
  i_p => get(2)
  i_p = 5

end program test

この動作を達成する方法はありますか; 多分私はいくつかの属性がありませんか?次のようなセッタールーチンの作成をバイパスしたい

set(i,value)

配列の外観を模倣する必要があるためです。私のアプリケーションでは、メンバー変数a,b,cは実際には異なるサイズの配列です

a = [a1, a2, a3]
b = [b1, b2]
c = [c1]

get(i,j)ゲッターにポインターのマトリックスを模倣させたい

        j = 1   2   3

i = 1:   [[a1, a2, a3],
i = 2:    [b1, b2, XX],
i = 3:    [c1, XX, XX]]

wehreXXは を参照していnull()ます。

更新: gfortran (バージョン 5.2.0) を使用しており、展開マシンには 4.6.x 以降のバージョンしかありません。したがって、提案された fortran 2008 標準機能は、残念ながら私には利用できません。すぐに使用できるコンパイラを使用せずに、上記の動作を模倣することは可能ですか?

更新2: 次のように構造を実装することになりました

type Vec_t
  integer, allocatable, dimension(:) :: vec
end type Vec_t
type(Vec_t), allocatable, dimension(:), target :: data

私はこのように初期化します(最後に言及する私の三角行列アプリケーション)

allocate(data(max))
do i=1,max
  allocate(data(i)%vec(i))
end do

そして、私はそれにアクセスして書き込みます

print*, data(2)%vec(1)
data(2)%vec(1) = 5

これはまさに私が求めていたものではありませんが、私のアプリケーションには十分です。

4

1 に答える 1