gpt4 book ai didi

fortran - 如何在公共(public) block 和模块之间共享数据?

转载 作者:行者123 更新时间:2023-12-02 16:57:13 26 4
gpt4 key购买 nike

如何在尽可能少的修改下将新的 Fortran 90 模块与旧代码连接起来?这个想法是在子例程中为新代码使用“模块”,同时对旧代码进行尽可能少的修改(即保持公共(public) block 不变)。

为了演示我想要实现的目标,这里是简单的程序:

考虑一个简单的程序:

  module Bmod
real*8 x
end module Bmod

program main
use Bmod
common /a/ x ! old code
do i=1, 5
x=3.14159 ! do something with x in fortran77
call B() ! new f90 code
enddo
end program main

! new features added here
subroutine new_code()
use Bmod
write(*,*) 'x in B=', x
end subroutine new_code

但是我在编译时遇到错误:

 error #6401: The attributes of this name conflict with those made accessible by a USE statement.   [X]
common /a/ x

一个简单的解决方案是到处使用 common 。但在我的情况下这是不允许的,因为它会修改旧代码。此外,旧代码包含数千个变量,分布在以旧样式编写的几个公共(public) block 中。

最佳答案

您可以将公共(public) block 定义放在模块内。在这种情况下,您可以将两者结合起来,但必须小心访问它的方式。

您不能在已通过模块访问公共(public) block 的任何单元中定义公共(public) block 。

  module Bmod
real*8 x
common /a/ x ! old code
end module Bmod

program main
real*8 x
common /a/ x ! old code
do i=1, 5
x=3.14159 ! do something with x in fortran77
call new_code() ! new f90 code
enddo
end program main

! new features added here
subroutine new_code()
use Bmod
write(*,*) 'x in B=', x
end subroutine new_code
<小时/>

关于您的错误消息:

您显示的代码无效

首先从模块导入符号x

use Bmod !x is in Bmod

然后你说它在一个命名的公共(public) block 中

common /a/ x  

你可以选择其中之一,两者都没有任何意义。您要么有一个模块变量,要么有一个来自公共(public) block 的变量。

您不必一次删除所有公共(public) block 。甚至一次也没有一个完整的公共(public) block 。但是,一旦将某些变量移动到模块中,就不能同时将其放在公共(public) block 中。如果您希望将其放在模块中,您可以一次使用一个变量,然后将其从公共(public) block 中删除并将其放入模块中。

关于fortran - 如何在公共(public) block 和模块之间共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39520914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com