タイトルにあるように、関数から取得したポインターを介してアクセスするデータを直接変更したいと考えています。割り当て (=) の左側にある関数によって返される参照を持つことは、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
これはまさに私が求めていたものではありませんが、私のアプリケーションには十分です。