【问题标题】:Are anonymous arrays possible in fortran?fortran 中可以使用匿名数组吗?
【发布时间】:2012-08-17 01:20:59
【问题描述】:

我正在尝试在 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 是否支持匿名数组,即(以防我的术语有误)只能通过引用访问的数组?

【问题讨论】:

  • 我不关注。疯狂地猜测,您的单独子例程可以分配指针组件,以便它们指向“临时”存储。您需要考虑该临时存储的生命周期。也许显示“似乎不起作用”的代码。

标签: pointers fortran anonymous-types anonymous


【解决方案1】:

当然;正如 IanH 建议的那样,您可以让指针直接引用分配的内存,而不是引用变量;这是分配的内存在超出范围后不会自动释放的少数情况之一。

例如,

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    

【讨论】:

  • 是的。做到了。我没有意识到分配指针是我想要的。我只认为 allocate 子例程是用于可分配数组的,但现在这很有意义。
  • 对于两个概念上(在语言内)不同的操作应该使用相同的语法并不明显,但它是......
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 2020-04-01
  • 2017-01-26
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多