'错误:实际参数包含的元素太少了吗?

问题描述 投票:0回答:1

我希望每个人都过得很好!

我发现,如果变量的大小是命名常量,那么当我将变量传递给输入变量大小不同的模块时,不会出现警告或错误。我想知道在编译代码时是否可能知道这种类型的问题。期待任何评论!谢谢!

我有以下两部分代码:

  1. scratch.f90:
INCLUDE "scratch_m.f90"

PROGRAM test

    USE globals

    IMPLICIT NONE
    REAL :: Vc(1:NB)

    CALL check(Vc)

END PROGRAM
  1. scartch_m.f90:
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 gfortran
1个回答
0
投票

不幸的是,这是完全合法的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

如果您确实确实想使用显式形状的数组,那么最好的办法是始终将数组的形状作为额外的伪参数传递。

最后,我知道这是重复的,但是我找不到较早的示例。如果有人可以找到要链接的文件,请继续。

© www.soinside.com 2019 - 2024. All rights reserved.