我在Fortran中编写了这个非常简单的代码:
program su
implicit none
real ran3
write(*,*) ran3(0)
end program su
real*8 function ran3(iseed)
implicit none
integer iseed
iseed=iseed*153941+1
ran3=float(iseed)*2.328+0.5
end function ran3
Run Code Online (Sandbox Code Playgroud)
我编译它没有问题,但是当我执行代码时,我收到此消息:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0xB76BAC8B
#1 0xB76BB2DC
#2 0xB77BA3FF
#3 0x8048653 in ran3_
#4 0x80486B3 in MAIN__ at der.f90:?
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
你能告诉我为什么,以及如何解决它?
我看到代码有两个问题.第一个是我认为是错误原因的那个.该函数ran3
以常量0
作为实际参数引用,但相应的伪参数iseed
在函数的赋值语句的左侧使用.这是一个错误:您无法更改零值.
第二个错误是ran3返回a real*8
(无论是什么;它是非标准声明),但在主程序ran3
中声明为默认值real
.
以下程序和函数使用gfortran 4.7.2进行编译.
program su implicit none real :: ran3 write(*, *) ran3(0) end program su function ran3(iseed) implicit none integer :: iseed, temp real :: ran3 temp = iseed * 153941 + 1 ran3 = temp * 2.328 + 0.5 end function ran3