在其他文件中定义的函数中访问Fortran模块
我正在使用Fortran 90。我在在其他文件中定义的函数中访问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
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)”。