Как получить доступ к глобальным переменным из функций Fortran - PullRequest
0 голосов
/ 07 сентября 2018

В частности, я пытаюсь эмулировать решение для Project Euler 31 в Фортране. Для этого мне нужно прочитать массив монет. И поскольку функция является рекурсивной, так как функция будет вызываться множество раз, я не хочу каждый раз передавать список в качестве аргумента, потому что если у меня будет множество копий списка, код будет иметь нагрузки накладных расходов памяти. Кроме того, в предыдущих задачах, например, для упрощения дроби, мне нужно было пройти через очень большой список. Итак, мой вопрос: в Фортране, как вы получаете доступ к переменным, определенным в основной программе, из функции. Это даже достижимо, и если нет, то сколько (намерение) поможет уменьшить любое дублирование памяти?

При необходимости:

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 голосов
/ 07 сентября 2018

Стандартный способ сделать это - определить переменную в модуле и использовать модуль в функции. Так что у вас будет что-то вроде:

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 массив монет виден, и вам не нужно каждый раз проходить его. Я сделал монеты размещаемыми, чтобы вы могли выделить их в нужной программе в основной программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...