使用常量参数调用函数时的Segfault

ami*_* bk 2 fortran fortran90

我在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)

你能告诉我为什么,以及如何解决它?

eri*_*ous 5

我看到代码有两个问题.第一个是我认为是错误原因的那个.该函数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