2011-12-06 10 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でsegfaultを取得し、ifortでbizzareエラーメッセージを表示します。私はほとんどの問題がメインプログラムの外部関数として宣言されていないrepにあると確信しているので、repは配列であり関数ではないと仮定しています。しかし、それが機能するように管理していませんでした。また、暗黙的にnoneを使用することをお勧めします。このような問題を絞り込むのに役立ちます。 – 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 

その後、必ずすべての変数を作るために、暗黙のnoneを使用、ラインも

use m_rep 

であなたのメインプログラムでモジュールを使用します適切に宣言されています。

+0

+1それは別ファイルにする必要はありません。より多くのモジュールを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

関連する問題