我正在尝试在 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 是否支持匿名数组,即(如果我的术语有误)只能通过引用访问的数组?
最佳答案
当然;正如 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
关于pointers - fortran 中可以使用匿名数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11998630/