【问题标题】:Problems with passing an array in fortran [closed]在fortran中传递数组的问题[关闭]
【发布时间】:2021-01-11 08:46:07
【问题描述】:

我正在对 fortran 子例程进行函数调用:

CALL EGFpar(T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)

这里 IWEG 在初始化例程中使用整数值进行初始化。 IWEG 和 WEG 在包含文件中声明:

  INTEGER  LIWEGmax, LWEGMAX
  PARAMETER (LIWEGmax=400, LWEGMAX=6000000)
  INTEGER IWEG(LIWEGmax)
  DOUBLE PRECISION WEG(LWEGmax)
  COMMON/EGINI/    IWEG, WEG

在使用 VSCode 进行调试时,我可以看到初始化它的值。 但是,当我进入 EGFpar 时,所有传递的数组都有它们的初始化值,除了 IWEG。 IWEG 什么都没有。不是零,而是空白。下面给出子程序EGFpar

C-----------------------------------------------------------------------
      SUBROUTINE EGFPAR ( NP, T, X, Y, CP, WEG, IWEG )
C-----------------------------------------------------------------------
C
C     This subroutine initializes the thermomolecular
C     parameters that are needed in order to evaluate
C     the transport linear systems.
C     The parameters that have to be evaluated depend on the transport
C     coefficients that will be subsequently computed, as indicated
C     by JFLAG. This flag has been initialized when calling EGINI.
C
C     Input
C     -----
C        NP           number of nodes
C        T(NP)        temperature
C        X(NP,NS)     species mole fractions
C        Y(NP,NS)     species mass fractions
C        CP(NP,NS)    species heat capacities at constant pressure
C                     per unit mass
C        WEG          double precision work array for EGLIB
C        IWEG         integer work array for EGLIB
C
C-----------------------------------------------------------------------
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      IMPLICIT INTEGER (I-N)
      DIMENSION WEG(*), IWEG(*)
C-----------------------------------------------------------------------
      INCLUDE 'eg.cmn'
C-----------------------------------------------------------------------
      CALL LFPAR ( NP, JFLAG, WEG(IEGPA), 
     &       T, WEG(IDLT1), WEG(IDLT2), WEG(IDLT3), 
     &       WEG(IDLT4), WEG(IDLT5), WEG(IDLT6),
     &       WEG(IEGRU), NS, WEG(IAAA), WEG(IBBB),
     &       WEG(IEGWT), WEG(IBIN), WEG(IETA), 
     &       WEG(IETALG), WEG(ICTAIJ), WEG(IFITA), 
     &       WEG(ICINT), CP, WEG(ICXI), 
     &       WEG(IEPSIJ), WEG(IEGEPS), WEG(IEGCFD), WEG(IEGCFE), 
     &       WEG(IEGZRT), WEG(IEGDIP), IWEG(IEGLIN) )
C-----------------------------------------------------------------------
      CALL EGFXY ( NP, NS, WEG(IXTR), WEG(IYTR), WEG(IAUX), X, Y )
C-----------------------------------------------------------------------
      RETURN
      END

这里出了什么问题?

【问题讨论】:

  • 我认为我们需要更多信息。你得到的实际代码是什么?初始化代码到底长什么样?我们需要查看所有变量的声明。见minimal reproducible example。特别是WEG 和IWEG。包含文件中有什么?
  • 初始化例程相当大。但是,我的问题是为什么具有值的数组在进入该子例程时会突然丢失数据。 IWEG 和 WEG 在包含文件中初始化。
  • 在CALL EGFpar(T_e,X_e,Y_e... 上方的第一行中,这只是一个错字还是您没有提供参数NP?
  • 天啊,这太愚蠢了。谢谢你拿起那个杰克。我无法将您的评论标记为已接受的答案
  • 另一个例子,说明为什么在调用子程序时应该在范围内有一个接口......

标签: fortran


【解决方案1】:

子程序调用

CALL EGFpar(T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)

错过了它的第一个整数参数NP,而应该是

CALL EGFpar(NP, T_e,X_e,Y_e,cpi(1:nx,1:Nspec),WEG,IWEG)

如果你有一个显式接口,这个错误可能已经被编译器捕获。 这可以通过多种方式完成:

  • 手动定义接口块
  • 在现代 Fortran 中,将过程放在一个模块中
  • 将过程放在contains 部分中(例如子程序、子子程序)

查看this answer 了解有关显式接口的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多