大头鼹鼠 发表于 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
上面是连续两次调用子例行程























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

大头鼹鼠 发表于 2016-5-11 10:37:31

问题发现了出在了对文件行数扫描的程序上,但是还是不知道怎么解决 努力中

龙行天下 发表于 2016-5-11 11:58:53

M=GetFileN(errs)
这个函数用的不好,第一次调用Material时,返回值为25,也即M=25;第二次调用时,M=-858993460(编译器随机指定的),下面的循环没用参与运算,结果便错了。。

大头鼹鼠 发表于 2016-5-11 13:28:09

是的 我发现了 后来我把读取文件行数的函数 重新写了一下,换了一个方法 现在好了感谢你

fcode 发表于 2016-5-11 15:10:28

这个 GetFileN 里面 Read(11,*,end=100) line 如果遇到结束了,就返回。但是没有 close,这样很危险。

大头鼹鼠 发表于 2016-5-12 11:51:03

我也发现这个程序有问题 ,当时也是借鉴别人的,我已经改过了不在采用end这个选项了,这也是比较老的写法
SubroutineNUM_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:37

你的问题是 Numline 没有初始化 = 0
如果你 Integer :: NumLine = 0 ,那么只会在第一次执行。第二次以后不再执行。

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

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:37

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

大头鼹鼠 发表于 2016-5-26 13:48:56

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

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

vvt 发表于 2016-5-26 14:33:32

点击 <> 插入代码,在里面输入代码就可以了
页: [1] 2
查看完整版本: 连续两次调用子例行程序 出错