Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 如何使用Fortran中包含另一个模块的模块?_Module_Fortran - Fatal编程技术网

Module 如何使用Fortran中包含另一个模块的模块?

Module 如何使用Fortran中包含另一个模块的模块?,module,fortran,Module,Fortran,我想这样做: module modA ... end module module modA ... end module module modB use mod A ... end module program ... end program main.f90使用模块A和模块B。 模块A.f90是独立的 模块B.f90使用模块A 我的代码如下: module modA ... end module module modA ... end module module modB us

我想这样做:

module modA
...
end module

module modA
...
end module

module modB
use mod A
...
end module

program 

...
end program
main.f90使用模块A和模块B。
模块A.f90是独立的
模块B.f90使用模块A

我的代码如下:

module modA
...
end module

module modA
...
end module

module modB
use mod A
...
end module

program 

...
end program
main.f90

include "module_A.f90"
include "module_B.f90"

program MAIN
use A
use B
write(*,*) Array(I)

end program MAIN
program main
use modB
use modA
...
end program
include modA.f90
include modB.f90

program main

use modB
use modA
...
end program
include modB.f90

program main

use modB
use modA
...
end program
模块A.f90

module A

integer, parameter :: I = 10

end
模块B.f90

include "module_A.f90"

module B

use A

real*8 :: Array(I)=1d0

end module B
但是,错误信息显示:

Error: module_A name 'module_A' at (1) is already being used as a MODULE at (2)
似乎我不能用一个模块来引用另一个模块。 有没有办法解决这个问题

(注意:这不是缺少“contains”的问题,因为它不涉及子程序或函数)

问题 当您在main.f90中包含modA.f90和modB.f90时,由于您已经在modB.90中包含modA.90,那么您的main.f90如下所示:

module modA
...
end module

module modA
...
end module

module modB
use mod A
...
end module

program 

...
end program
因为在fortran中不能有两个同名的单元,编译器会失败,并出现您看到的错误,因为您声明了两个模块modA

使用使用说明进行固定(推荐) modA.f90

module modA.f90
...
end module
module modA.f90
...
end module
module modA.f90
...
end module
modB.90

module modB
use modA
...
end module
module modB
use modA
...
end module
include modA.f90

module modB
use modA
...
end module
main.f90

include "module_A.f90"
include "module_B.f90"

program MAIN
use A
use B
write(*,*) Array(I)

end program MAIN
program main
use modB
use modA
...
end program
include modA.f90
include modB.f90

program main

use modB
use modA
...
end program
include modB.f90

program main

use modB
use modA
...
end program
然而,
use
语句需要处理依赖关系,因此必须在
modB.f90

gfortran -o main modA.f90 modB.90 main.f90
使用包含报表进行固定(已折旧) 我不推荐此解决方案,但为了完整性起见,提供了此解决方案

第一个答案 modA.f90

module modA.f90
...
end module
module modA.f90
...
end module
module modA.f90
...
end module
modB.90

module modB
use modA
...
end module
module modB
use modA
...
end module
include modA.f90

module modB
use modA
...
end module
main.f90

include "module_A.f90"
include "module_B.f90"

program MAIN
use A
use B
write(*,*) Array(I)

end program MAIN
program main
use modB
use modA
...
end program
include modA.f90
include modB.f90

program main

use modB
use modA
...
end program
include modB.f90

program main

use modB
use modA
...
end program
在这种情况下,由于
include
类似于复制粘贴,我们只需要编译程序

gfortran -o main main.f90
gfortran -o main main.f90
第二个答案 modA.f90

module modA.f90
...
end module
module modA.f90
...
end module
module modA.f90
...
end module
modB.90

module modB
use modA
...
end module
module modB
use modA
...
end module
include modA.f90

module modB
use modA
...
end module
由于modA已经包含在内,因此无需再次执行

main.f90

include "module_A.f90"
include "module_B.f90"

program MAIN
use A
use B
write(*,*) Array(I)

end program MAIN
program main
use modB
use modA
...
end program
include modA.f90
include modB.f90

program main

use modB
use modA
...
end program
include modB.f90

program main

use modB
use modA
...
end program
同样,我们只需要编译程序

gfortran -o main main.f90
gfortran -o main main.f90

您为什么使用
包含
而不是
使用
?@francescalus感谢您的改进建议。你的意思是
包括模块A.f90
应该是
包括“模块A.f90”
?非常感谢!我只是意识到“include”除了将额外的代码粘贴到文件中之外什么都不做。实际上,只需先编译模块就足以在主程序中“使用”它们。阅读本文第3.4段可能会有所帮助