fortran向量值函数给出总线错误

fortran向量值函数给出总线错误,fortran,Fortran,下面的程序给了我一个总线错误。。。你知道为什么吗 program main integer, parameter :: n = 3 integer, dimension(n) :: out out = rep(1,n) print *, (out(i), i=1,n) end program function rep(x,n) integer :: x integer :: n integer, dimension(n) :: rep do i

下面的程序给了我一个总线错误。。。你知道为什么吗

  program main
  integer, parameter :: n = 3
  integer, dimension(n) :: out

  out = rep(1,n)
  print *, (out(i), i=1,n)

  end program

  function rep(x,n)
  integer :: x
  integer :: n
  integer, dimension(n) :: rep

  do i=1,n
     rep(i) = x
  enddo

  end function

我认为这与
整数,维度(n)::rep
有关,但我不确定为什么会发生这种情况。

仍然不能完全回答您的问题,但可能一个子程序调用而不是函数对您有效:

program main
implicit none
integer :: i
integer, parameter :: n = 3
integer, dimension(n) :: out

call repeat(1,3,out) 
print *, (out(i), i=1,n)

end program

subroutine repeat(x,n,y)
implicit none
integer :: i   
integer,intent(in) :: x,n
integer,dimension(n),intent(out) :: y

do i=1,n
  y(i) = x
enddo

endsubroutine
希望有人能为你的功能提供答案。我遇到的问题是Fortran不允许您执行以下操作:

integer,external :: rep(n)

仍然不能完全回答您的问题,但可能一个子程序调用而不是函数对您有效:

program main
implicit none
integer :: i
integer, parameter :: n = 3
integer, dimension(n) :: out

call repeat(1,3,out) 
print *, (out(i), i=1,n)

end program

subroutine repeat(x,n,y)
implicit none
integer :: i   
integer,intent(in) :: x,n
integer,dimension(n),intent(out) :: y

do i=1,n
  y(i) = x
enddo

endsubroutine
希望有人能为你的功能提供答案。我遇到的问题是Fortran不允许您执行以下操作:

integer,external :: rep(n)

您需要使接口显式,以确保Fortran在调用它时知道rep是什么。将rep函数放入单独文件中的模块中,如下所示:

  module m_rep

  contains

  function rep(x,n)

  implicit none

  integer :: x
  integer :: n
  integer :: i
  integer, dimension(n) :: rep

  do i=1,n
     rep(i) = x
  enddo

  end function

  end module
然后将主程序中的模块与行一起使用

  use m_rep

另外,使用隐式无来确保所有变量都正确声明。

您需要使接口显式,以确保Fortran在调用它时知道rep是什么。将rep函数放入单独文件中的模块中,如下所示:

  module m_rep

  contains

  function rep(x,n)

  implicit none

  integer :: x
  integer :: n
  integer :: i
  integer, dimension(n) :: rep

  do i=1,n
     rep(i) = x
  enddo

  end function

  end module
然后将主程序中的模块与行一起使用

  use m_rep

另外,请使用隐式无来确保所有变量都已正确声明。

您收到的错误消息是什么?我得到pgf90和gfortran的SEGFULT,以及ifort的一些bizzare错误消息。我几乎可以肯定问题出在rep没有在主程序中声明为外部函数,所以它假定rep是数组而不是函数。但并没有设法让它发挥作用。此外,良好的实践是始终使用隐式none。这将有助于缩小此类问题的范围。您收到的错误消息是什么?我得到pgf90和gfortran的SEGFULT,以及ifort的一些bizzare错误消息。我几乎可以肯定问题出在rep没有在主程序中声明为外部函数,所以它假定rep是数组而不是函数。但并没有设法让它发挥作用。此外,良好的实践是始终使用隐式none。它将有助于缩小像这样的问题。+1尽管它不需要单独的文件。多个模块可以集成在一个模块中。接口块也可以在没有模块的情况下使用。是的,您也可以使用接口块。在我学习模块如何工作之前,我就这么做了,它更复杂,但它可以工作。接口可以工作,但有一个缺点,它必须保持与过程定义(函数或子例程)一致。如果更改过程,则必须更改调用和接口。如果将过程放在模块中,则“使用”该模块的任何程序或过程都知道该接口,并且无需程序员进一步努力即可获得过程和调用之间的一致性检查。在这种情况下,如果更改过程,只需更改调用即可。更少的工作和更少的出错机会。感谢-对于向量/数组值函数,这是唯一一种看起来有效的方法(使用
gfortran
)。我无法将程序上方的模块包含在同一文件中。
接口
块似乎也很有用,下一次可能会调用它。+1但它不需要单独的文件。多个模块可以集成在一个模块中。接口块也可以在没有模块的情况下使用。是的,您也可以使用接口块。在我学习模块如何工作之前,我就这么做了,它更复杂,但它可以工作。接口可以工作,但有一个缺点,它必须保持与过程定义(函数或子例程)一致。如果更改过程,则必须更改调用和接口。如果将过程放在模块中,则“使用”该模块的任何程序或过程都知道该接口,并且无需程序员进一步努力即可获得过程和调用之间的一致性检查。在这种情况下,如果更改过程,只需更改调用即可。更少的工作和更少的出错机会。感谢-对于向量/数组值函数,这是唯一一种看起来有效的方法(使用
gfortran
)。我无法将程序上方的模块包含在同一文件中。
接口
块似乎也很有用,下次可能会调用。谢谢-这是老式的f77样式(除了现代声明)-我考虑过它,但我真的想让它成为一个函数。谢谢-这是老式的f77样式(除了现代声明)-我考虑过,但我真的想让它成为一种功能。