Fortran Coder

标题: 连续两次调用子例行程序 出错 [打印本页]

作者: 大头鼹鼠    时间: 2016-5-11 08:59
标题: 连续两次调用子例行程序 出错
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)














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


作者: 大头鼹鼠    时间: 2016-5-11 10:37
问题发现了出在了对文件行数扫描的程序上,但是还是不知道怎么解决 努力中
作者: 龙行天下    时间: 2016-5-11 11:58
M=GetFileN(errs)
这个函数用的不好,第一次调用Material时,返回值为25,也即M=25;第二次调用时,M=-858993460(编译器随机指定的),下面的循环没用参与运算,结果便错了。。

作者: 大头鼹鼠    时间: 2016-5-11 13:28
是的 我发现了 后来我把读取文件行数的函数 重新写了一下,换了一个方法 现在好了  感谢你
作者: fcode    时间: 2016-5-11 15:10
这个 GetFileN 里面 Read(11,*,end=100) line 如果遇到结束了,就返回。但是没有 close,这样很危险。

作者: 大头鼹鼠    时间: 2016-5-12 11:51
我也发现这个程序有问题 ,当时也是借鉴别人的,我已经改过了  不在采用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 外面 否则第二次调用就会有问题
作者: fcode    时间: 2016-5-12 12:38
你的问题是 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

作者: 大头鼹鼠    时间: 2016-5-12 14:13
"Num = 0 !//这个很重要"其实这句话很关键,谢谢版主,程序越来月精简,我以前使用function的,因为要做有限差分的计算,不希望每个程序都很长,所以我就不使用function功能了,这个只能返回一个值,用起来也不太方便,谢谢 以后多多指点

作者: 大头鼹鼠    时间: 2016-5-26 13:48
fcode 发表于 2016-5-12 12:38
你的问题是 Numline 没有初始化 = 0
如果你 Integer :: NumLine = 0 ,那么只会在第一次执行。第二次以后不 ...

你好 你给我的回复里面那些标准的格式有颜色的字是什么上去的呀?我搞了好久似乎也不行
作者: vvt    时间: 2016-5-26 14:33
点击 <> 插入代码,在里面输入代码就可以了
作者: 大头鼹鼠    时间: 2016-5-27 10:58
vvt 发表于 2016-5-26 14:33
点击  插入代码,在里面输入代码就可以了

恩 谢谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2