Fortran Coder

标题: 关于Fortran95的module中变量save问题 [打印本页]

作者: zhennile    时间: 2015-11-30 23:56
标题: 关于Fortran95的module中变量save问题
[Fortran] 纯文本查看 复制代码

program ex1
implicit none
integer::a
a=10
call sub()
write(*,*)a
end
subroutine sub()
implicit none
integer::a
a=20
write(*,*)a
return
end

返回值为
20
10
但是用module写
[Fortran] 纯文本查看 复制代码

module global
implicit none
integer::a
end module
program ex
use global
implicit none
a=10
call sub()
write(*,*)a
end
subroutine sub()
use global
implicit none
a=20
write(*,*)a
return
end

返回值为
20
20
为什么?
作者: fcode    时间: 2015-12-1 08:59
因为 module 中的变量 a 具有save属性,是同一个 a
而主程序和外部子程序中的 a 是不同的 a
作者: 978142355    时间: 2015-12-1 15:29
本帖最后由 978142355 于 2015-12-1 15:31 编辑

彭老师第206页中间已经写明了。另外编译器也是其中一个原因。但总体原因和群主说的是一样的,想得到与子程序那个相同的结果,别忘了在module中的integer加个save

2015-12-01_152826.jpg (34.71 KB, 下载次数: 411)

2015-12-01_152826.jpg

作者: fcode    时间: 2015-12-1 15:45
是的。这是一个有争议的问题。
虽然语法没明确说 module 变量一定具有 save 属性。但我们接触到的所有编译器都这么认定。

而且,站在编译器设计的角度,让module变量不具有save属性,更难。

如果你非常纠结,并且希望它具有save属性,那么可以手动书写 save。
如果你非常纠结,并且希望它不要具有 save 书写,那么最好是别用 module
作者: 978142355    时间: 2015-12-1 22:09
fcode 发表于 2015-12-1 15:45
是的。这是一个有争议的问题。
虽然语法没明确说 module 变量一定具有 save 属性。但我们接触到的所有编译 ...

拜学了,还是群主解释的更到位一些。
作者: zhennile    时间: 2015-12-1 23:22
醍醐灌顶
作者: Glen    时间: 2022-10-17 23:28
module有点像c++里面的static变量,是存放在内存空间的全局/静态区,而不是栈区或堆区。不知我说的对不对。
作者: kyra    时间: 2022-10-18 09:24
Glen 发表于 2022-10-17 23:28
module有点像c++里面的static变量,是存放在内存空间的全局/静态区,而不是栈区或堆区。不知我说的对不对。 ...

module中的变量,生命周期是整个程序运行期间。作用域只在use了该module的程序单元。
至于他存储的位置,可能在初始化数据区,也可能在堆里。一般不会在栈里。

虽然Fortran的Type派生类型,强烈的和C++的结构体相似。但module在C++里没有完全类似的对应语法。

作者: Glen    时间: 2022-10-18 10:14
kyra 发表于 2022-10-18 09:24
module中的变量,生命周期是整个程序运行期间。作用域只在use了该module的程序单元。
至于他存储的位置, ...

C++的全局变量或者静态变量虽然生命周期也是整个程序运行期间,但是作用域要么是所有源代码要么是单个cpp文件。module的作用域类似C++的命名空间吧,只在"using namespace"的程序单元。

我的感觉module就是在生命周期上类似全局变量和静态变量,在作用域上类似命名空间,不知是否靠谱。
作者: kyra    时间: 2022-10-18 10:50
的确 module 有点类似 C++ 的 namespace。但又不完全是,他俩的相似和区别,我能理解,但不知道该如何归纳。
作者: 风平老涡    时间: 2022-10-19 20:35
本帖最后由 风平老涡 于 2022-10-19 20:36 编辑

所有的module变量自动获得save功能,和编译器无关。见F2018(草稿),8.5.16节第106页第一行;F2008,5.3.17节第101页第四段。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2