我希望每个人都过得很好!
我发现,如果变量的大小是命名常量,那么当我将变量传递给输入变量大小不同的模块时,不会出现警告或错误。我想知道在编译代码时是否可能知道这种类型的问题。期待任何评论!谢谢!
我有以下两部分代码:
INCLUDE "scratch_m.f90"
PROGRAM test
USE globals
IMPLICIT NONE
REAL :: Vc(1:NB)
CALL check(Vc)
END PROGRAM
MODULE globals
IMPLICIT NONE
INTEGER, PARAMETER :: NX = 15
INTEGER, PARAMETER :: NB = 64
CONTAINS
SUBROUTINE check(Vc)
IMPLICIT NONE
! Inputs
REAL, INTENT(IN) :: Vc(1:NX)
WRITE(*,*) Vc
END SUBROUTINE check
END MODULE
我使用带有某些标志的gfortran进行编译:gfortran scratch.f90 -o scratch.out -O3 -ffree-line-length-none -Wno-unused -fimplicit-none -Wall -fcheck=bound,do -ffpe-trap=invalid,zero,overflow
。
不幸的是,这是完全合法的Fortran,因此,编译器不需要在编译时报告任何内容。仅要求实际,伪参数的类型,种类和等级匹配,而形状则没有要求。因此,编译器不会执行任何操作。更糟糕的是,这可能意味着数组边界检查可能无法按照您的要求进行。因此,最好始终对虚拟参数使用假定形状的数组-当您被启发并使用模块时,这根本不是什么大问题。这使您的模块
MODULE globals
IMPLICIT NONE
INTEGER, PARAMETER :: NX = 15
INTEGER, PARAMETER :: NB = 64
CONTAINS
SUBROUTINE check(Vc)
IMPLICIT NONE
! Inputs
REAL, INTENT(IN) :: Vc(:)
WRITE(*,*) Vc
END SUBROUTINE check
END MODULE
如果您确实确实想使用显式形状的数组,那么最好的办法是始终将数组的形状作为额外的伪参数传递。
最后,我知道这是重复的,但是我找不到较早的示例。如果有人可以找到要链接的文件,请继续。