program test
implicit none
real(dp),allocatable :: a(:), b(:)
allocate (a(10))
a = 1.d0
(*) b = a
end program
在上面的代码中,我设置了两个可分配变量 -
a
和 b
- 但只在代码中分配了 a
。我原本以为代码会无法编译,但它编译成功了,而下面的代码执行类似的任务,却出现了 SEGFAULT 错误。program test_fail
implicit none
real(dp),allocatable :: a(:), b(:)
integer :: i
allocate ( a(10) )
a = 1.d0
do i = 1, 10
b(i) = a(i)
enddo
end program
可以理解为前面的代码自动分配了变量b
,这样是正确的吗?
subroutine test_sub(a)
implicit none
real(dp),intent(inout) :: a(:,:)
...
end program
在上述的带有形状数组输入的子程序中,可以理解为代码自动检测输入数组a
的大小,并在子程序中分配自己的数组,在返回到其上层框架时进行释放,这样做是否合适?
最后一个问题,当我将一个数组复制到另一个数组时,哪种方式更快?
program speed1
implicit none
real(dp), allocatable :: a(:,:,:), b(:,:,:)
allocate( a(10000,10000,10000) )
a = 1.d0
b = a
end program
program speed2
implicit none
real(dp), allocatable :: a(:,:,:), b(:,:,:)
integer :: i, j, k
allocate( a(10000,10000,10000), b(10000,10000,10000) )
a = 1.d0
do i = 1,10000
do j = 1,10000
do k = 1,10000
b(i,j,k) = a(i,j,k)
enddo
enddo
enddo
end program
b
赋值的规则在Fortran 2003中发生了改变,因此行为可能取决于编译器版本和/或编译时标志。 - francescalusspeed2
中修复什么?我已经尝试了几种不同的i,j,k
组合顺序,但它们都比b = a
语句慢。如果是二维情况,使用 Fortran 的列主序排序,我期望j,i
的顺序会更快。但对于三维情况,哪种i,j,k
的顺序是 Fortran 中最优的呢?在我的测试中,i,j,k
是最快的。 - Sangjun Leedo k; do j; do i; arr(i,j,k)
。但是,只需使用b=a
就可以简单明了地完成操作,而且从编译器的角度来看,这可能等效于正确排序的循环。 - Jonatan Öström