※ 引述《sven1130 (綠色貍貓)》之銘言:
: 如題
: 這個問題困擾我很久了
: 本魯使用visual studio
: 目前我這個程式的架構
: 是由C++去呼叫一個for的dll
: 然後跑dll裡面眾多的subroutine
: 重點來了
: 當我跑了六次這個迴圈的時候
: 在跑完!******************************************
: 標示的該行後
: 有一個於這個迴圈都沒有出現的參數NNE(7)
: 會自動變為一個很奇怪的數字
: 原本為14跑完後變為一個極大的數字
: 但該行甚至這個迴圈 與參數NNE應該是一點關係也沒有
: 為何會這樣 求解 先謝過大家了
: 附圖
: https://imgur.com/7kf4X9E
: 按一下F11逐步執行後變成
: https://imgur.com/gznxEKU
: 完全沒有道理啊@@
: 附上該迴圈
: 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的程式碼都找出來慢慢看了