2011-12-06 55 views
1

下面的程序給了我一個總線錯誤......任何想法爲什麼?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=1,n 
    rep(i) = x 
    enddo 

    end function 

我認爲它與integer, dimension(n) :: rep有關,但我不知道爲什麼會發生這種情況。

+0

你得到的錯誤信息是什麼?我用pgf90和gfortran得到段錯誤,並且用ifort得到了一些bizzare錯誤信息。我幾乎可以肯定,問題是rep在主程序中沒有被聲明爲外部函數,所以它假定rep是一個數組而不是函數。但沒能成功實現。另外,最好的做法是在整個過程中使用隱式。這將有助於縮小這類問題的範圍。 – milancurcic

回答

5

你需要做的界面明確,以確保Fortran語言知道代表是當你調用它。把你的代表功能到一個模塊在一個單獨的文件中像這樣:

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 

而且在模塊中使用自己的主程序使用隱無,以確保所有的變量正確申報。

+0

+1它不必一個單獨的文件,但。更多的模塊可以在一個。另外一個接口模塊可以在沒有模塊的情況下使用。 –

+0

是的,你也可以使用接口塊。在我學習模塊如何工作之前,我做到了這一點,它更復雜,但它的工作原理。 – bananafish

+2

一個接口可以工作,但有一個缺點,它必須保持與程序定義(函數或子程序)一致。如果您更改了程序,則必須更改呼叫和界面。如果你把程序放在一個模塊中,那麼任何程序或過程都知道該接口「使用」該模塊,程序員和程序員之間沒有進一步的努力就可以獲得程序和調用之間的一致性檢查。在這種情況下,如果您更改過程,則只需更改呼叫。減少工作,減少錯誤的機會。 –

1

仍然沒有確切的回答你的問題,但也許一個子程序調用,而不是功能會爲你工作:

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) 
+0

謝謝 - 這是老派的f77風格(現代聲明除外) - 我想過但我真的想讓它成爲一種功能。 – hatmatrix