【问题标题】:Accessing a Fortran module in a function defined in some other file在其他文件中定义的函数中访问 Fortran 模块
【发布时间】:2010-05-19 12:58:26
【问题描述】:

我正在使用 Fortran 90。我在 fileA.f 中定义了一个 Fortran 模块:

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 中,我有一个 Fortran 函数。我正在尝试访问a(1) 的值:

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

  return 
end

但我在编译时遇到错误。它说它无法访问模块getArr。这与在 function 中而不是在 subroutine 中使用模块有关吗?我应该如何声明我的函数?

【问题讨论】:

    标签: fortran


    【解决方案1】:

    T.E.D.语法是正确的——“getArr%”不是数组“a”名称的一部分。该表示法用于用户派生类型。

    语言标准之外的另一个方面——编译源代码: 对于大多数编译器,您需要按顺序编译文件,将包含模块的源代码文件放在使用它的任何单独文件之前。编译器必须先“了解”一个模块,然后才能使用它。

    另外,您的示例中有主程序吗?

    如果还是不行,请告诉我们确切的错误信息。

    【讨论】:

    • @M.S.B.您对文件的编译顺序是正确的。解决了这个问题,谢谢!
    • @M.S.B.:在subroutine my_sub 中,它没有写入 a(1) 的值。我在做任何明显的错误吗?
    • 至少在您显示的代码中,没有写语句。试试“写 (*, *) a(1)”。
    【解决方案2】:

    您似乎正在尝试使用getArr% 作为某种模块说明符。你确定这是对的吗?我不是 f90 专家,但我的编译器似乎不支持这样的东西。一旦您执行use,该模块中的所有内容都可以在本地使用,就像您在子例程中声明它一样。

    尝试删除 getArr% 看看会发生什么。

    【讨论】:

    • 对不起,这是一个错误。如果在模块中定义了“类型”块,则 % 可用于带有该类型块的变量。即使我删除了它(在上面的代码中进行了更正),它也会给出相同的错误。在“函数”中使用模块有什么关系吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2017-10-28
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多