※ 引述《sven1130 (绿色貍猫)》之铭言:
: 如题
: 这个问题困扰我很久了
: 本鲁使用visual studio
: 目前我这个程式的架构
: 是由C++去呼叫一个for的dll
: 然后跑dll里面众多的subroutine
: 重点来了
: 当我跑了六次这个循环的时候
: 在跑完!******************************************
: 标示的该行后
: 有一个于这个循环都没有出现的参数NNE(7)
: 会自动变为一个很奇怪的数字
: 原本为14跑完后变为一个极大的数字
: 但该行甚至这个循环 与参数NNE应该是一点关系也没有
: 为何会这样 求解 先谢过大家了
: 附图
:
: 按一下F11逐步执行后变成
:
: 完全没有道理啊@@
: 附上该循环
: DO I=L,1,-1
: OPEN(60,FILE='MANNING.DAT',STATUS='OLD')
: OPEN(61,FILE='NCCHECH.OUT',STATUS='UNKNOWN')
: READ(60,1002) NC
: 1002 FORMAT(5X,F8.5)
: CMN(I,J)=NC
: !******************************************
: WRITE(61,*)"CMN(",I,",",J,")",CMN(I,J)
: !******************************************
: !将CMN写入NCCHECH.OUT
: READ(IIN,1004) NDS(I,J),XL,XR,LL,LR,LC
: 1004 FORMAT(8X,F8.0,2F8.2,3F8.0)
: C DIST1(I,J)=(LL+LC+LR)/3.0
: DIST1(I,J)=(LL+LC+LR)/3.0*3
: KK=NDS(I,J)
: WRITE(5,1006)J,I,NDS(I,J),XL,XR,DIST1(I,J),CMN(I,J)
: 1006 FORMAT(//5X,I3,2X,I3,4X,F8.0,2X,F8.2,2X,F8.2,2X,F8.2,2X,F8.4)
: READ(IIN,1008)(AY(II,I,J),AX(II,I,J),II=1,KK)
: 1008 FORMAT(2X,F6.2,9F8.2)
: WRITE(5,1978)(AY(II,I,J),AX(II,I,J),II=1,KK)
: 1978 FORMAT(2X,F6.2,9F8.2)
: Z(I,J)=100.0
: DO 1010 II=1,KK
: IF(AX(II,I,J).EQ.XL) N1(I,J)=II
: IF(AX(II,I,J).EQ.XR) N2(I,J)=II
: IF(Z(I,J).GE.AY(II,I,J)) THEN
: Z(I,J)=AY(II,I,J)
: Z919(I,J)=AY(II,I,J)
: END IF
: 1010 CONTINUE
: WRITE(5,1012) N1(I,J),N2(I,J),Z(I,J)
: c WRITE(*,1012) N1(I,J),N2(I,J),Z(I,J)
: 1012 FORMAT(5X,I8,2X,I8,2X,F8.2)
: END DO
经过和认识的工程师讨论后,我确定有某个以FORTRAN开始学的人不会发生
但是从其他语言过来的人可能会没注意到的问题
那就是,FORTRAN的副程式(subroutine)和函式(function)
并不是单纯地call by value而已,call此程式的程式内的变量也会被改变
举个例子:
program main
implicit none
integer :: var
var = 10
call FortranVar(var)
write(*,*) var
stop
end
subroutine FortranVar(var2) !var2就是在FortranVar内的var
implicit none
integer :: var2
var2 = var2**2
return
end
出来的结果会是100,其他程式语言应该会变成10(不变)
看到变量出问题时我有想到这个可能,可是因为这对从FORTRAN开始学的人来说很正常
就忽略这个可能原因了
不过,后来想到当我走出FORTRAN看到别的程式语言都是call by value后很不能接受
所以反过来说,其他语言的使用者在接触到FORTRAN时不知道这点的可能性其实不小
重点是,要注意到这代表所有在副程式和函式内变更的值都会影响回叫出他们的程式
所以有在用Fortran的人,至少我自己在写的时候
只要程式很大,习惯性会写程式码把数值复制下来
放在别的变量后,将原本的变量原封不动地还回去(也就是自己写成call by value)
写了这么多,结论是
我怀疑问题根本是出在那一坨subroutine和function之中
可能需要把程式码复制到word上搜寻有NNE的地方
把每一行有关于NNE的程式码都找出来慢慢看了