2

Fortranで配列の配列を作成しようとしています。

次のようなもの

TYPE :: array_of_arrays
   REAL, DIMENSION(:), POINTER :: p => NULL()
END TYPE

TYPE(array_of_arrays), DIMENSION(2) :: some_array

私ができるように:

REAL, DIMENSION(3), TARGET :: some_vector1 = (/1.0, 2.1, 4.3/)
REAL, DIMENSION(3), TARGET :: some_vector2 = (/3.0, 1.2, 9.6/)

some_array(1)%p => some_vector1
some_array(2)%p => some_vector2

WRITE(*,*) some_array(1)%p ! I see some_vector1
WRITE(*,*) some_array(2)%p ! I see some_vector2

some_vectorこれらの配列のそれぞれを、配列の配列内の各要素に対応するように実際に宣言するのは面倒です。

私がやりたいのは、一時ベクトルがターゲットとして設定されている別のサブルーチンにあり、そのサブルーチンは、その一時ベクトルを指すように配列の配列を設定します。

このようにして、匿名配列を作成できます。

ただし、これは機能していないようで、Fortranがサポートしていないことを最初に行っているのではないかと思います。

では、Fortranは匿名配列、つまり(用語が間違っている場合に備えて)参照を介してのみアクセスできる配列をサポートしていますか?

4

1 に答える 1

4

もちろん; IanH が示唆するように、変数を参照するのではなく、割り当てられたメモリを直接参照するポインタを持つことができます。これは、割り当てられたメモリがスコープ外になると自動的に割り当てが解除されない数少ないケースの 1 つです。

例えば、

module arrays


TYPE :: array_of_arrays
   REAL, DIMENSION(:), POINTER :: p => NULL()
END TYPE

contains

subroutine alloc(aa)
    type(array_of_arrays), intent(inout) :: aa(:)
    integer :: i

    allocate( aa(1)%p(1) )
    aa(1) % p = [1.]

    allocate( aa(2)%p(5) )
    aa(2) % p = [ (i, i=1,5) ]

end subroutine alloc

end module arrays



program usearrays
    use arrays

    TYPE(array_of_arrays), DIMENSION(2) :: some_array

    call alloc(some_array)

    WRITE(*,*) some_array(1)%p ! I see some_vector1
    WRITE(*,*) some_array(2)%p ! I see some_vector2

    deallocate( some_array(1) )
    deallocate( some_array(2) )

end program usearrays

そしてそれを実行すると

$ gfortran -o arrays arrays.f90 
$ ./arrays 
   1.0000000    
   1.0000000       2.0000000       3.0000000       4.0000000       5.0000000    
于 2012-08-17T03:36:47.970 に答える