Arrays 目的:不使用延迟大小而使用可分配大小,反之亦然
我正在学习fortran(90),有c和python方面的经验。我正在阅读关于数组的文章(有趣的是,看到这么多python数组行为都是基于fortran的);我想知道,有没有理由分配一个Arrays 目的:不使用延迟大小而使用可分配大小,反之亦然,arrays,memory-management,fortran,fortran90,Arrays,Memory Management,Fortran,Fortran90,我正在学习fortran(90),有c和python方面的经验。我正在阅读关于数组的文章(有趣的是,看到这么多python数组行为都是基于fortran的);我想知道,有没有理由分配一个可分配的数组,而不分配一个延迟大小?不使用可分配的,是否可以延迟大小?如果可以,如何延迟 e、 g 在Fortran中,数组术语可能有点令人生畏。首先要实现的是实际参数(过程必须为其分配一些内存的变量)和伪参数(调用过程传递的实际参数的占位符)之间的区别。如果变量在过程的参数列表中,则它是伪参数 因此,对于实际参
可分配的数组,而不分配一个延迟大小?不使用可分配的
,是否可以延迟大小?如果可以,如何延迟
e、 g
在Fortran中,数组术语可能有点令人生畏。首先要实现的是实际参数(过程必须为其分配一些内存的变量)和伪参数(调用过程传递的实际参数的占位符)之间的区别。如果变量在过程的参数列表中,则它是伪参数
因此,对于实际参数,有两种类型的数组:
- 显式形状,例如
::A(3,6)
- 延迟形状,例如
,我发现它是一个理想的参考
最后但并非最不重要的一点是,既然您提到了python,就不要急于在Fortran中应用类似python的数组切片,因为它会导致使用临时数组,这会降低程序的速度。您可以将gfortran与-fcheck=array temp
一起使用来发出警告。此外,即使建议对整个阵列执行基本操作以提高效率(例如,A=A+1
in),也不要将其误解为“编写非常简洁的代码有利于提高效率”。后者当然(不一定)正确。如果arr1
是过程的伪参数,则第一个参数有效。我不相信第二个是有效的。
REAL, DIMENSION(:) :: arr1
REAL, ALLOCATABLE, DIMENSION(20) :: arr2
program toby
integer, parameter :: n = 10
real :: a(n**3)
call my_sub(a,n)
end program
subroutine my_sub(a,n)
integer, intent(in) :: n
real, intent(inout) :: a(n,n,*)
...
end subroutine
program toby
integer, parameter :: n = 10
real :: a(n,n,n)
call my_sub(a)
contains
subroutine my_sub(a)
real, intent(inout) :: a(:,:,:)
integer :: n
n = size(a,1)
...
end subroutine
end program