剛開始學 fortran,用生成亂數的演算法練習subroutine和function,發現這三段程式運行完結果不同,求教各位大佬這到底是哪里出了問題?
1
program random
implicit none
real :: x
call random_seed () ! 系統根據日期和時間隨機地提供種子
call random_number (x) ! 每次的亂數就都不一樣了
write(*,*) x !輸出一個0——1之間的亂數
stop
end program random
這段運行完可以正常生成0-1的亂數
2.
PROGRAM random2
IMPLICIT NONE
!real::A = 1
real::x
call random()
WRITE(*,*)"亂數是",x
STOP
END
SUBROUTINE random()
IMPLICIT NONE
real::x
call random_seed () ! 系統根據日期和時間隨機地提供種子
call random_number (x) ! 每次的亂數就都不一樣了
RETURN !輸出一個0——1之間的亂數
END SUBROUTINE
這段運行完生成一個正負無窮范圍內的亂數
3.
PROGRAM random3
IMPLICIT NONE
REAL,EXTERNAL::random
!real::A = 1
real::y
y = random()
WRITE(*,*)"亂數是",y
STOP
END
REAL FUNCTION random()
real::x
call random_seed () ! 系統根據日期和時間隨機地提供種子
call random_number (x) ! 每次的亂數就都不一樣了
RETURN !輸出一個0——1之間的亂數
END FUNCTION
這段運行完結果是0
如有大佬不吝賜教,不勝感激
uj5u.com熱心網友回復:
Build 時不看提示資訊?第二個有 warning 說,沒有給 x 賦值卻使用了它;第三個說 那函授沒回傳值。第二個,用程序就不合適吧,不知道 fortran 有沒有指標的說法,不知道怎么改。
第三個,把 RETURN 替換為 random = x 試試了。
現在看 fortran 確實拗口啊
uj5u.com熱心網友回復:
Fortran的函式引數默認總是傳參考,如果要傳值,要加上value ::修飾:SUBROUTINE func(x)
real, value :: x
!...
不過這個用法好像只有Fortran 2003+標準中才支持,更早的標準都不支持(但是某些編譯器有非標準擴展支持傳值)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/7059.html
標籤:匯編語言
上一篇:新手小問題
