回 帖 发 新 帖 刷新版面

主题:[讨论]save 、module里变量初始化后变随机

我用fortran对simpack进行二次开发,由于是fortran新手,对很多变量的作用域不清楚。

第一次我定义了变量
  INTEGER,save :: iflag
并在程序初始化的时候定义了 iflag=0
  可是程序里输出结果里iflag一直等于1,不知道什么原因。

我看了很多前辈的帖子,用module来定义变量
    module myvar
    integer sflag
    end module myvar
然后再在子程序的开头,加了 use sflag.
并在程序初始化的时候定义了sflag=0.可是程序里输出结果里sflag也一直等于1。

其它地方没有对iflag和sflag重新赋值。编译器为cvf6.6。

我的目的就是定义成像c里面static变量类型。
麻烦高手们看下问题出在哪里?顺便请教下save、static(fortran里的)、common和用module定义的变量之间的相同点和区别。

回复列表 (共7个回复)

沙发

save  会记住上次调用的值,慎用

板凳

“不得用”的语言特性:
- allocatable、intent、pointer、save、dimension、parameter和target语句形式。(用属性形式代替。)
- external语句形式。(用显式的接口代替。)
- assign、赋值go to、交错return、continue、entry、和计算go to 语句。
- include文件。(用模块代替。)
- data和block data。(在类型声明语句中进行初始化或赋值。)
- common块。(将全局数据放在模块中,用模块代替。)
- equivalence。(被认为是许多难以查找的编程错误的来源。)
- double precision语句。(用real语句声明双精度的实型数。)
- 语句函数。(用内部函数代替。)
- 专用固有函数。(用类属函数代替。)
- 假定大小数组。(用假定形状数组代替。)
- do n (其中n为语句标号)。(用do和end do代替。)
- 非整数do变量和表达式。
- 同一行上多条语句。
- 逻辑型case表达式。
- 从if块外面分支到end if。
- where语句形式。(用where结构形式。)
- 在open和inquire语句中的blank= 说明符。
- 双字关键词之间要求有空格:in out,go to。不能写为inout,goto。
这个是mltx的建议

3 楼

fortran标准里面没有static, 不过cvf之类编译器貌似是扩展了. 我的理解save就是相当于C里面的static.
module里面声明的变量默认就有save属性, 有点就是打包地共享变量, 使用方便.
common也是通过划分一片内存区域让各个函数模块之间访问实现变量共享. common是使用不方便,而且是以排身位的方式,不小心就会出错. 基本现在编程已经放弃不用的了.

其他的楼上写得很清楚了.

4 楼

那谁知道
初始化和输出结果之前
你到底做了啥

难道只是这样:
integer :: aaa=1
print *,aaa

5 楼


在实际的程序中会根据状态变量进行赋值。
目前发现iflag的值有问题之后,我调试程序的时候初始化之后就没有对变量进行再赋值。

6 楼

[quote]那谁知道
初始化和输出结果之前
你到底做了啥

难道只是这样:
integer :: aaa=1
print *,aaa[/quote]

在实际的程序中会根据状态变量进行赋值。
目前发现iflag的值有问题之后,我调试程序的时候初始化之后就没有对变量进行再赋值

7 楼

看看是不是把aaa当参数传到函数或是子程序里了?
看看是不是越界访问了?

我来回复

您尚未登录,请登录后再回复。点此登录或注册