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

时间:2018-09-06 23:30:22

标签: fortran

具体地说,我正在尝试在Fortran中模拟the solution to 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

1 个答案:

答案 0 :(得分: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
...

现在nways中,可以看到阵列硬币,而不必每次都通过。我制作了可分配的硬币,以便您可以在主程序中将其分配为所需的大小。