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

Function 为传递给函数的变量赋值会导致分段错误。,function,fortran,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

考虑一下这个简单的程序:

  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
传递给函数。然后你试着改变它

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
编译器现在会抱怨的。它还将抱怨其他意图。然后,您可以修复代码,使编译器满意


而且总是使用
隐式无
。这不是可选的。这是必需的。

您将文本值
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
编译器现在会抱怨的。它还将抱怨其他意图。然后,您可以修复代码,使编译器满意

而且总是使用
隐式无
。这不是可选的。这是必要的