求问为什么这个子程序调用最后的结果输出时正确的,但是不能输入到文件中?

问题补充&&
猜你感兴趣
服务声明: 信息来源于互联网,不保证内容的可靠性、真实性及准确性,仅供参考,版权归原作者所有!Copyright &
Powered by后使用快捷导航没有帐号?
只需一步,快速开始
扫一扫,访问微社区
只需一步, 快速开始
查看: 722|回复: 7
去掉感叹号为何结果不同?——求助子程序变量作用域的问题
在线时间 小时
登录后查看更多精彩内容~
才可以下载或查看,没有帐号?
在fortran中子程序有一个初始化定义的值integer::i=1为何它只在第一次调用的时候才赋这个值,以后再调用这个子函数时 i 不从1开始重新定义呢?
fortran书上第209页不是有说“子程序中变量的生存期仅局限在该子程序被调用期间,在下次进入子程序时,重新给这些变量分配新的存储单元”吗?
请问哪位大侠能告诉我我哪里理解错了?
举个例子:为何以下的程序把子程序中的感叹号去掉,结果会不一样?明明在定义的时候已经赋初值了啊?
myf2.dat的数据是这样的:
0.85,& & 6.75
1.62,& & 7.88
3.27,& & 4.44
4.44,& & 7.89
5.28,& & 9.87
6.11,& & 8.46
7.80,& & 21.50
myf2.f90的程序是这样的:
program main
implicit none
!external f
real c,x,z,f
open(1,file='myf2.dat')
open(2,file='myf2.out')
rewind (1)
rewind (2)
& &read(1,*)x,c
& &z=f(x,c)
& &write(2,'(2f6.2,f9.5)')x,c,z
end program main
function f(x,c) result(g)
implicit none
integer ::n=1
real ::x,c,g,pi=3.1415926,eps=1e-10,temp !temp记录级数通项
& &&&!& && &n=1
temp=cos((2*n-1)*pi*x/c)/(2*n-1)**2
do while(abs(temp)&=eps)
& && &n=n+1
& &temp=cos((2*n-1)*pi*x/c)/(2*n-1)**2
& &g=g+temp
g=sqrt((c*pi**2)/(2*x)-4*c/x*g)
end function f
给自己设置一个个性的签名吧~
在线时间 小时
&成长值: 6085
楼主你是说变量n吗?楼主描述的再清楚一些吧,你想象中应该是什么样的结果,现实是什么结果
fortran中的external是函数参数化的声明,这样就可以把函数当做参数传递
给自己设置一个个性的签名吧~
在线时间 小时
mofangbao 发表于
楼主你是说变量n吗?楼主描述的再清楚一些吧,你想象中应该是什么样的结果,现实是什么结果
fortran中的ex ...
我自己也测试了一下,貌似真的出现了楼主的说的这种问题。为了方便计算,我将楼主的代码改了稍微改了一下,数据也换了。
myf2.txt的数据为:
程序为:program main
implicit none
!external f
integer c,x,z,f
integer i
open(11,file='myf2.txt')
open(21,file='myf2.out')
rewind (11)
rewind (21)
do i=1,7
& &read(11,*)x,c
& &z=f(x,c)
& &write(21,*)x,c,z
& &write(*,*)x,c,z
end do
end program main
function f(x,c)
implicit none
integer ::n=1
integer ::x,c,f
!& && &n=1
f=x*n+c*2*n
do while(f&=100)
& &n=n+1
& &f=x*n+c*2*n
& &print*,n,f
end do
end function f
复制代码如果注释掉子函数中的n=1时,屏幕上的结果是:
& && && & 2& && && & 14
& && && & 3& && && & 21
& && && & 4& && && & 28
& && && & 5& && && & 35
& && && & 6& && && & 42
& && && & 7& && && & 49
& && && & 8& && && & 56
& && && & 9& && && & 63
& && && &10& && && & 70
& && && &11& && && & 77
& && && &12& && && & 84
& && && &13& && && & 91
& && && &14& && && & 98
& && && &15& && && &105
& && && & 1& && && &&&3& && && &105
& && && & 2& && && &&&5& && && &180
& && && & 3& && && &&&7& && && &255
& && && & 4& && && &&&9& && && &330
& && && & 5& && && & 11& && && &405
& && && & 6& && && & 13& && && &480
& && && & 7& && && & 15& && && &555
复制代码但是不注释n=1时,屏幕上得到的结果是:
& && && &&&2& && && & 14
& && && &&&3& && && & 21
& && && &&&4& && && & 28
& && && &&&5& && && & 35
& && && &&&6& && && & 42
& && && &&&7& && && & 49
& && && &&&8& && && & 56
& && && &&&9& && && & 63
& && && & 10& && && & 70
& && && & 11& && && & 77
& && && & 12& && && & 84
& && && & 13& && && & 91
& && && & 14& && && & 98
& && && & 15& && && &105
& && && &&&1& && && &&&3& && && &105
& && && &&&2& && && & 24
& && && &&&3& && && & 36
& && && &&&4& && && & 48
& && && &&&5& && && & 60
& && && &&&6& && && & 72
& && && &&&7& && && & 84
& && && &&&8& && && & 96
& && && &&&9& && && &108
& && && &&&2& && && &&&5& && && &108
& && && &&&2& && && & 34
& && && &&&3& && && & 51
& && && &&&4& && && & 68
& && && &&&5& && && & 85
& && && &&&6& && && &102
& && && &&&3& && && &&&7& && && &102
& && && &&&2& && && & 44
& && && &&&3& && && & 66
& && && &&&4& && && & 88
& && && &&&5& && && &110
& && && &&&4& && && &&&9& && && &110
& && && &&&2& && && & 54
& && && &&&3& && && & 81
& && && &&&4& && && &108
& && && &&&5& && && & 11& && && &108
& && && &&&2& && && & 64
& && && &&&3& && && & 96
& && && &&&4& && && &128
& && && &&&6& && && & 13& && && &128
& && && &&&2& && && & 74
& && && &&&3& && && &111
& && && &&&7& && && & 15& && && &111
复制代码可以看到两个结果是截然不同的。第一个结果中显然在第一次循环以后(即i=2,3,4,5,6,7)是记住了第一次循环结束时n=15的值,并在第一次循环之后被程序记住了(子程序中声明中integer n=1,显然在第一次循环后是失效的),这与fortran书中所说的“子程序中变量的生存期仅局限在该子程序被调用期间,在下次进入子程序时,重新给这些变量分配新的存储单元”不一致。
不知道我这样说明是不是楼主想表达的意思。关于这一点我也不明白,所以希望高手解答。我自己也去看看书,看看究竟是怎么回事。
给自己设置一个个性的签名吧~
在线时间 小时
楼主,不知道你是否已经知道了原因。如果知晓,求解释。
给自己设置一个个性的签名吧~
在线时间 小时
&成长值: 6085
冬日情愫+ 发表于
我自己也测试了一下,貌似真的出现了楼主的说的这种问题。为了方便计算,我将楼主的代码改了稍微改了一下 ...
仔细看这段话应该就能明白了,是编译器的原因~
1.png (99.97 KB, 下载次数: 0)
23:19 上传
给自己设置一个个性的签名吧~
在线时间 小时
mofangbao 发表于
仔细看这段话应该就能明白了,是编译器的原因~
也就是说如果我要想每次进入子函数的时候都要求n=1,就不能使用在声明的时候就赋值了(integer::n=1),必须在声明之后单独赋值了是吗?
给自己设置一个个性的签名吧~
在线时间 小时
&成长值: 6085
冬日情愫+ 发表于
也就是说如果我要想每次进入子函数的时候都要求n=1,就不能使用在声明的时候就赋值了(integer:: ...
那你的需求 有这个需求的话就是的&&那段话的意思就是你处理的时候要认为值一直是连续的,如果你想让他连续,就加save关键字,更保险,不想让他连续,就要自己再做另外的处理
给自己设置一个个性的签名吧~
在线时间 小时
mofangbao 发表于
那你的需求 有这个需求的话就是的&&那段话的意思就是你处理的时候要认为值一直是连续的,如果你想让他连续 ...
给自己设置一个个性的签名吧~《VFP面向对象程序设计》课程习题集及参考答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
《VFP面向对象程序设计》课程习题集及参考答案
第​一​章​ ​数​据​库​基​本​理​论​
​
​一​、​判​断​题​
​
​
​
.​数​据​处​理​的​目​的​就​是​从​原​始​数​据​中​得​到​有​用​的​信​息​。​
​
​ ​ ​ ​ ​A​.​对​*​
​
​ ​ ​ ​ ​B​.​错​
​
.​关​系​模​型​的​结​构​可​以​看​作​是​一​个​数​据​库​的​结​构​。​
​
​ ​ ​ ​ ​A​.​对​*​
​
​ ​ ​ ​ ​B​.​错​
​
.​数​据​库​管​理​系​统​是​数​据​库​系​统​ ​ ​ ​ ​B​.​错​
​
​
​
.​ ​V​F​P​ ​系​统​为​用​户​提​供​了​命​令​操​作​方​式​、​菜​单​操​作​方​式​和​程​序​操​作​方​式​。​
​
​ ​ ​ ​ ​A​.​对​*​
​
​B​.​错​
​
​
​
​二​、​单​选​题​
​
.​将​数​据​集​中​起​来​以​一​定​的​组​织​方​式​存​放​在​计​算​机​的​外​部​存​储​器​中​,​就​构​成​了​ ​ ​ ​
​
​ ​。​
​
​A​.​操
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢从菜鸟到高手捷径(何勤)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
从菜鸟到高手捷径(何勤)
《​轻​松​学​习​C​程​序​设​计​》​一​书​作​者​的​最​新​作​品​,​让​你​能​够​全​方​位​学​编​程​。​尤​其​是​编​程​原​理​、​编​程​思​路​讲​得​通​俗​易​懂​、​清​晰​透​彻​。​一​书​在​手​,​让​你​真​正​学​会​编​程​。​推​荐​指​数​*​*​*​*​*
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢}

我要回帖

更多关于 子程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信