连续两次调用子例行程序 出错
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
上面是连续两次调用子例行程
序,第一次调用完全正确,第二次调用,就会出错 不知道什么原因 大神指点一下
问题发现了出在了对文件行数扫描的程序上,但是还是不知道怎么解决 努力中 M=GetFileN(errs)
这个函数用的不好,第一次调用Material时,返回值为25,也即M=25;第二次调用时,M=-858993460(编译器随机指定的),下面的循环没用参与运算,结果便错了。。
是的 我发现了 后来我把读取文件行数的函数 重新写了一下,换了一个方法 现在好了感谢你 这个 GetFileN 里面 Read(11,*,end=100) line 如果遇到结束了,就返回。但是没有 close,这样很危险。
我也发现这个程序有问题 ,当时也是借鉴别人的,我已经改过了不在采用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 外面 否则第二次调用就会有问题 你的问题是 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 "Num = 0 !//这个很重要"其实这句话很关键,谢谢版主,程序越来月精简,我以前使用function的,因为要做有限差分的计算,不希望每个程序都很长,所以我就不使用function功能了,这个只能返回一个值,用起来也不太方便,谢谢 以后多多指点
fcode 发表于 2016-5-12 12:38
你的问题是 Numline 没有初始化 = 0
如果你 Integer :: NumLine = 0 ,那么只会在第一次执行。第二次以后不 ...
你好 你给我的回复里面那些标准的格式有颜色的字是什么上去的呀?我搞了好久似乎也不行 点击 <> 插入代码,在里面输入代码就可以了
页:
[1]
2