Fortran Coder

查看: 25050|回复: 10
打印 上一主题 下一主题

[Module] 关于Fortran95的module中变量save问题

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
10 点
跳转到指定楼层
楼主
发表于 2015-11-30 23:56:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
[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
为什么?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1961

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1350 元
贡献
570 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-12-1 08:59:07 | 只看该作者
因为 module 中的变量 a 具有save属性,是同一个 a
而主程序和外部子程序中的 a 是不同的 a

40

帖子

11

主题

0

精华

大宗师

F 币
4119 元
贡献
1857 点

规矩勋章

QQ
板凳
发表于 2015-12-1 15:29:25 | 只看该作者
本帖最后由 978142355 于 2015-12-1 15:31 编辑

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

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

2015-12-01_152826.jpg
where is dream,where is home

1961

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1350 元
贡献
570 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-12-1 15:45:55 | 只看该作者
是的。这是一个有争议的问题。
虽然语法没明确说 module 变量一定具有 save 属性。但我们接触到的所有编译器都这么认定。

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

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

40

帖子

11

主题

0

精华

大宗师

F 币
4119 元
贡献
1857 点

规矩勋章

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

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

2

帖子

1

主题

0

精华

新人

F 币
21 元
贡献
10 点
6#
 楼主| 发表于 2015-12-1 23:22:07 | 只看该作者
醍醐灌顶
回复

使用道具 举报

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
21 点
7#
发表于 2022-10-17 23:28:04 | 只看该作者
module有点像c++里面的static变量,是存放在内存空间的全局/静态区,而不是栈区或堆区。不知我说的对不对。

评分

参与人数 1F 币 +1 收起 理由
fcode + 1 啊,对对对

查看全部评分

235

帖子

0

主题

0

精华

版主

World Analyser

F 币
630 元
贡献
464 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
8#
发表于 2022-10-18 09:24:33 | 只看该作者
Glen 发表于 2022-10-17 23:28
module有点像c++里面的static变量,是存放在内存空间的全局/静态区,而不是栈区或堆区。不知我说的对不对。 ...

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

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

9

帖子

3

主题

0

精华

入门

F 币
49 元
贡献
21 点
9#
发表于 2022-10-18 10:14:32 | 只看该作者
kyra 发表于 2022-10-18 09:24
module中的变量,生命周期是整个程序运行期间。作用域只在use了该module的程序单元。
至于他存储的位置, ...

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

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

235

帖子

0

主题

0

精华

版主

World Analyser

F 币
630 元
贡献
464 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
10#
发表于 2022-10-18 10:50:52 | 只看该作者
的确 module 有点类似 C++ 的 namespace。但又不完全是,他俩的相似和区别,我能理解,但不知道该如何归纳。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-25 11:36

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表