如何从Fortran函数访问全局变量

L5R*_*5RK 2 fortran

具体来说,我试图模拟Fortran中Project Euler 31的解决方案.为了做到这一点,我需要从一系列硬币中读取.由于函数是递归的,因为函数将被调用次数,我不希望每次都必须将列表作为参数传递,因为如果我有大量的列表副本,代码就会有负载内存开销 此外,在以前的问题中,比如简化分数的函数,我需要通过一个非常大的列表.所以我的问题是:在Fortran中,如何从函数中访问主程序中定义的变量.它是否可以实现,如果没有,有多少意图(帮助)减轻任何内存重复?

如有必要:

RECURSIVE FUNCTION NWAYS(AMOUNT,CUR_COIN,) RESULT(RES)
IMPLICIT NONE
INTEGER            :: AMOUNT, CUR_COIN, RES, COINS !Coins is a list defined in the main program
RES = 0
IF (CUR_COIN<=1) THEN
  RES = 1
  RETURN
END IF

DO WHILE(AMOUNT>=0)
  RES = RES + NWAYS(AMOUNT,CUR_COIN-1)
  AMOUNT = AMOUNT-COINS(CUR_COIN)
END DO

RETURN

END FUNCTION NWAYS
Run Code Online (Sandbox Code Playgroud)

Ste*_*nel 5

执行此操作的标准方法是在模块中定义变量并在函数中使用模块.所以你会有类似的东西:

module var_mod
integer, allocatable :: coins(:)
end module var_mod

program euler
use var_mod
...
allocate (coins(ncoins))
...
recursive function nways (...)
use var_mod
...
Run Code Online (Sandbox Code Playgroud)

现在在nways中,阵列硬币是可见的,你不必每次都传递它.我制作了可分配的硬币,以便您可以在主程序中将其分配到所需的大小.