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样式(除了现代声明)-我考虑过,但我真的想让它成为一种功能。