Fortran Coder

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

[子程序] 连续两次调用子例行程序 出错

[复制链接]

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
跳转到指定楼层
楼主
发表于 2016-5-11 08:59:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Write(*,*)"请输入镀膜的材料"
    Read(*,*) Name_F
    Call Material(Name_F,Dens_F,Spec_F,Cond_F)
    Write(*,*) Name_F,Dens_F,Spec_F,Cond_F
    Write(*,*)"请输入基底的材料"
    Read(*,*) Name_B
    Call Material(Name_B,Dens_B,Spec_B,Cond_B)
    Write(*,*)Name_B,Dens_B,Spec_B,Cond_B
上面是连续两次调用子例行程 ABC_to_abc.f90 (439 Bytes, 下载次数: 4)


Main_Program.f90 (1.5 KB, 下载次数: 3)


Material.f90 (1.22 KB, 下载次数: 8)


material.txt (736 Bytes, 下载次数: 3)














序,第一次调用完全正确,第二次调用,就会出错 不知道什么原因 大神指点一下

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
沙发
 楼主| 发表于 2016-5-11 10:37:31 | 只看该作者
问题发现了出在了对文件行数扫描的程序上,但是还是不知道怎么解决 努力中

22

帖子

4

主题

0

精华

熟手

F 币
319 元
贡献
154 点
板凳
发表于 2016-5-11 11:58:53 | 只看该作者
M=GetFileN(errs)
这个函数用的不好,第一次调用Material时,返回值为25,也即M=25;第二次调用时,M=-858993460(编译器随机指定的),下面的循环没用参与运算,结果便错了。。

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
地板
 楼主| 发表于 2016-5-11 13:28:09 | 只看该作者
是的 我发现了 后来我把读取文件行数的函数 重新写了一下,换了一个方法 现在好了  感谢你

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

5#
发表于 2016-5-11 15:10:28 | 只看该作者
这个 GetFileN 里面 Read(11,*,end=100) line 如果遇到结束了,就返回。但是没有 close,这样很危险。

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
6#
 楼主| 发表于 2016-5-12 11:51:03 | 只看该作者
我也发现这个程序有问题 ,当时也是借鉴别人的,我已经改过了  不在采用end这个选项了,这也是比较老的写法
[Fortran] 纯文本查看 复制代码
Subroutine  NUM_LINE(Num) 
    Integer::Numline=0,value=0,Num
    Character line
    OPEN(UNIT=11,FILE='material.txt',STATUS='OLD')
    Do While(value==0)
    Read(11,*,iostat=value) line
    If(value/=0)cycle
    Numline=Numline+1
    End Do
    Num=Numline
    Close(11)
    End 

新的 算法 多指点  不知道为什么 这个子程序调用num这个赋值必须在enddo 外面 否则第二次调用就会有问题

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

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

7#
发表于 2016-5-12 12:38:37 | 只看该作者
你的问题是 Numline 没有初始化 = 0
如果你 Integer :: NumLine = 0 ,那么只会在第一次执行。第二次以后不再执行。

另外,这种情况,用 Function 会更方便

[Fortran] 纯文本查看 复制代码
Integer Function Num_Line() result( Num )
  Integer   :: k
  Character :: line
  Num = 0 !//这个很重要
  OPEN(11,FILE='material.txt',STATUS='OLD')
  Do
    Read(11,*,iostat=k) line
    If( k /= 0 ) exit
    Num = Num + 1
  End Do
  Close(11)
End Function Num_Line

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
8#
 楼主| 发表于 2016-5-12 14:13:37 | 只看该作者
"Num = 0 !//这个很重要"其实这句话很关键,谢谢版主,程序越来月精简,我以前使用function的,因为要做有限差分的计算,不希望每个程序都很长,所以我就不使用function功能了,这个只能返回一个值,用起来也不太方便,谢谢 以后多多指点

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
9#
 楼主| 发表于 2016-5-26 13:48:56 | 只看该作者
fcode 发表于 2016-5-12 12:38
你的问题是 Numline 没有初始化 = 0
如果你 Integer :: NumLine = 0 ,那么只会在第一次执行。第二次以后不 ...

你好 你给我的回复里面那些标准的格式有颜色的字是什么上去的呀?我搞了好久似乎也不行

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
10#
发表于 2016-5-26 14:33:32 | 只看该作者
点击 <> 插入代码,在里面输入代码就可以了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 15:12

Powered by Tencent X3.4

© 2013-2024 Tencent

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