在其他文件中定义的函数中访问Fortran模块

在其他文件中定义的函数中访问Fortran模块,fortran,Fortran,我正在使用Fortran 90。我在fileA.f中将Fortran模块定义为: module getArr double precision a(100) end module getArr double precision function my_func(R) use getArr double precision x x = a(1) return end 相同的fileA.f包含使用此模块的子例程: subroutine my_sub use get

我正在使用Fortran 90。我在
fileA.f
中将Fortran模块定义为:

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

  return 
end
相同的
fileA.f
包含使用此模块的子例程:

subroutine my_sub
   use getArr
   implicit none

   a(1) = 10.5

end subroutine
fileB.f
中,我有一个Fortran函数。我试图访问
a(1)
的值,如下所示:

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

  return 
end

但是我在编译时出错了。它表示无法访问模块
getArr
。这与在函数中使用模块而不是在子例程中使用模块有关吗?我应该如何声明我的函数?

看起来您正试图使用
getArr%
作为某种模块说明符。你确定那是对的吗?我不是f90专家,但我的编译器似乎不支持类似的东西。一旦你做了一个
use
模块中的所有东西都可以在本地使用,就像你在子程序中声明的一样


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

看起来您正试图使用
getArr%
作为某种模块说明符。你确定那是对的吗?我不是f90专家,但我的编译器似乎不支持类似的东西。一旦你做了一个
use
模块中的所有东西都可以在本地使用,就像你在子程序中声明的一样


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

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

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

另外,您的示例中是否有主程序


如果仍然不起作用,请向我们显示确切的错误消息。

t.E.D.的语法正确--“getArr%”不是数组“a”名称的一部分。该符号用于用户派生的类型

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

另外,您的示例中是否有主程序


如果仍然不起作用,请向我们显示确切的错误消息。

抱歉,这是一个错误。如果在模块中定义了一个“类型”块,则%可用于包含该类型块的变量。即使我删除了它(在上面的代码中进行了更正),它也会给出相同的错误。在“函数”中使用模块有什么问题吗?对不起,这是个错误。如果在模块中定义了一个“类型”块,则%可用于包含该类型块的变量。即使我删除了它(在上面的代码中进行了更正),它也会给出相同的错误。在“函数”中使用模块有什么关系吗?@M.S.B.您对文件编译顺序的看法是正确的。这解决了问题谢谢@M.S.B.:在
子程序my_sub
中,它没有写入a(1)的值。我有什么明显的错误吗?至少在你展示的代码中,没有write语句。请尝试“write(*,*)a(1)”@M.S.B。文件的编译顺序是正确的。这解决了问题谢谢@M.S.B.:在
子程序my_sub
中,它没有写入a(1)的值。我有什么明显的错误吗?至少在你展示的代码中,没有write语句。尝试“写(*,*)a(1)”。