zhennile 发表于 2015-11-30 23:56:29

关于Fortran95的module中变量save问题


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写

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:07

因为 module 中的变量 a 具有save属性,是同一个 a
而主程序和外部子程序中的 a 是不同的 a

978142355 发表于 2015-12-1 15:29:25

本帖最后由 978142355 于 2015-12-1 15:31 编辑

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

fcode 发表于 2015-12-1 15:45:55

是的。这是一个有争议的问题。
虽然语法没明确说 module 变量一定具有 save 属性。但我们接触到的所有编译器都这么认定。

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

如果你非常纠结,并且希望它具有save属性,那么可以手动书写 save。
如果你非常纠结,并且希望它不要具有 save 书写,那么最好是别用 module

978142355 发表于 2015-12-1 22:09:03

fcode 发表于 2015-12-1 15:45
是的。这是一个有争议的问题。
虽然语法没明确说 module 变量一定具有 save 属性。但我们接触到的所有编译 ...

拜学了,还是群主解释的更到位一些。

zhennile 发表于 2015-12-1 23:22:07

醍醐灌顶

Glen 发表于 2022-10-17 23:28:04

module有点像c++里面的static变量,是存放在内存空间的全局/静态区,而不是栈区或堆区。不知我说的对不对。

kyra 发表于 2022-10-18 09:24:33

Glen 发表于 2022-10-17 23:28
module有点像c++里面的static变量,是存放在内存空间的全局/静态区,而不是栈区或堆区。不知我说的对不对。 ...

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

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

Glen 发表于 2022-10-18 10:14:32

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

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

我的感觉module就是在生命周期上类似全局变量和静态变量,在作用域上类似命名空间,不知是否靠谱。

kyra 发表于 2022-10-18 10:50:52

的确 module 有点类似 C++ 的 namespace。但又不完全是,他俩的相似和区别,我能理解,但不知道该如何归纳。
页: [1] 2
查看完整版本: 关于Fortran95的module中变量save问题