Arrays 目的:不使用延迟大小而使用可分配大小,反之亦然

Arrays 目的:不使用延迟大小而使用可分配大小,反之亦然,arrays,memory-management,fortran,fortran90,Arrays,Memory Management,Fortran,Fortran90,我正在学习fortran(90),有c和python方面的经验。我正在阅读关于数组的文章(有趣的是,看到这么多python数组行为都是基于fortran的);我想知道,有没有理由分配一个可分配的数组,而不分配一个延迟大小?不使用可分配的,是否可以延迟大小?如果可以,如何延迟 e、 g 在Fortran中,数组术语可能有点令人生畏。首先要实现的是实际参数(过程必须为其分配一些内存的变量)和伪参数(调用过程传递的实际参数的占位符)之间的区别。如果变量在过程的参数列表中,则它是伪参数 因此,对于实际参

我正在学习fortran(90),有c和python方面的经验。我正在阅读关于数组的文章(有趣的是,看到这么多python数组行为都是基于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