Доступ к модулю Fortran в функции, определенной в другом файле

Я использую Fortran 90. Я определил модуль Fortran в fileA.f как:

module getArr
   double precision a(100)
end module getArr

Тот же fileA.f содержит подпрограмму, использующую этот модуль:

subroutine my_sub
   use getArr
   implicit none

   a(1) = 10.5

end subroutine

В fileB.f у меня есть функция на Фортране. Я пытаюсь получить доступ к значению a(1) как:

double precision function my_func(R)
  use getArr
  double precision x
  x = a(1)

  return 
end

Но я получаю ошибки во время компиляции. Пишет, что не может получить доступ к модулю getArr. Это как-то связано с использованием модуля внутри функции, а не внутри подпрограммы? Как я должен объявить свою функцию?


person cppb    schedule 19.05.2010    source источник


Ответы (2)


ТЕД. верно о синтаксисе - "getArr%" не является частью имени массива "a". Эта нотация используется для пользовательского типа.

Еще один аспект, выходящий за рамки стандарта языка, — компиляция исходного кода. В большинстве компиляторов вам необходимо компилировать файлы по порядку, помещая файл исходного кода, содержащий модуль, перед любым отдельным файлом, который его использует. Компилятор должен «знать» о модуле, прежде чем он сможет его использовать.

Кроме того, у вас есть основная программа в вашем примере?

Если это все еще не работает, пожалуйста, покажите нам точное сообщение об ошибке.

person M. S. B.    schedule 19.05.2010
comment
@МСБ вы были правы насчет порядка компиляции файлов. Это решило проблему, спасибо! - person cppb; 19.05.2010
comment
@MSB: в subroutine my_sub он не записывает значение для a (1). Есть ли очевидная ошибка, которую я делаю? - person cppb; 19.05.2010
comment
По крайней мере, в коде, который вы показываете, нет оператора записи. Попробуйте написать (*, *) a(1). - person M. S. B.; 19.05.2010

Похоже, вы пытаетесь использовать getArr% как своего рода спецификатор модуля. Вы уверены, что это правильно? Я не специалист по f90, но мой компилятор, похоже, ничего подобного не поддерживает. Как только вы выполните use, все содержимое этого модуля будет доступно локально, как вы объявили это в своей подпрограмме.

Попробуйте удалить этот getArr% и посмотрите, что произойдет.

person T.E.D.    schedule 19.05.2010
comment
извините, это была ошибка. Если внутри модуля определен блок типов, то % можно использовать для переменных в этом блоке типов. Даже когда я удаляю это (исправление, сделанное в приведенном выше коде), это дает ту же ошибку. Есть ли что-то с использованием модуля внутри функции? - person cppb; 19.05.2010