我已经在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


我编译它没有问题,但是当我执行代码时,我收到以下消息:

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)


请问原因,以及如何解决?

最佳答案

我看到代码有两个问题。第一个是我认为是导致错误的原因。函数ran3以常量0作为实际参数引用,但是在函数中赋值语句的左侧使用了相应的伪参数iseed。这是一个错误:您无法更改零值。

第二个错误是ran3返回一个real*8(可能是这样;这是一个非标准的声明),但是在主程序中将ran3声明为默认的real

以下程序和函数可使用gfortran 4.7.2进行编译。

程序su
隐式无
真正的:: ran3

write(*,*)ran3(0)
结束程序su

函数ran3(iseed)
隐式无
整数:: iseed,临时
真正的:: ran3

临时= iseed * 153941 + 1
ran3 =温度* 2.328 + 0.5
结束函数ran3

关于fortran - 使用常量参数调用函数时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16457423/

10-11 11:02