为传递给函数的变量赋值会导致分段错误。

时间:2017-09-12 09:07:23

标签: function fortran

考虑这个简单的程序:

  program foo
  integer bar,idum

  print * , bar(1)
  end program


  function bar(idum)
      integer idum,bar
      print * , idum
      idum =  2
      bar =  2
      return
  end

当我运行它时,我在行idum = 2

上遇到了分段错误
Starting program: /tmp/a.out 
           1

Program received signal SIGSEGV, Segmentation fault.
0x000000000040081b in bar (idum=1) at play.f:11
11            idum =  2

我不允许为传递给函数的变量赋值吗?我如何将它们用作旗帜?

1 个答案:

答案 0 :(得分:3)

您将文字值1传递给该函数。然后你尝试在

中更改它
idum =  2

这是不允许的。代码尝试更改文字常量并崩溃,因为这是不可能的。

如果要更改函数内的值,则a)它必须是变量,而不是常量值,b)必须按值传递(Fortran 2003)。

在现代Fortran 始终中使用显式接口。我的意思是总是。要么使用模块(首选!!!),要么在简单的情况下使用内部函数,如:

  program foo
    integer bar,idum

    print * , bar(1)

  contains

    function bar(idum)
      integer idum,bar
      print * , idum
      idum =  2
      bar =  2
      return
    end function
  end program

编译器可能会告诉你你做错了。特别是,如果为参数指定intent

function bar(idum)
   integer bar
   integer, intent(in) :: idum

编译器现在抱怨。它也会抱怨其他意图。然后,您可以修复代码以使编译器满意。

始终!!!!! 使用IMPLICIT NONE。这不是可选的。这是必要的。