2012-02-24 10 views
1

次のコードは、Linuxシステムでpgf90でコンパイルするとセグメンテーションエラーが発生しますが、Windows上でインテルVisual FORTRANを使用すると正常に実行されます。Fortranでサブルーチンを呼び出す(セグメンテーションフォールト)

program main 
implicit none 
integer:: a(3), b(3) ,c(3) 
a=[3, 4, 5] 
b=[1, 2, 3] 
call sub(a,b,c) 
write(*,*)'a+b = ',c 
end program main 

subroutine sub(a,b,c) 
implicit none 
integer, intent(in)::a(:),b(:) 
integer, intent(out)::c(:) 
c=a+b 
end subroutine sub 

これに関する説明はありますか?

+0

整数:: a(3)、b(3)、c(6)ではいけませんか? –

+0

segfaultはどこにありますか?モジュールを使用できますか? – haraldkl

+0

@JulienMay:そうは思わない。サイズ3の配列を2つ追加すると、サイズ6ではなくサイズ3の配列が返されます。 – eriktous

答えて

3

シェイプ仮引数をとるサブルーチンを呼び出すと(このプログラムの場合のように)、明示的なインタフェースが必要です。これを達成する最も簡単な方法は、サブルーチンをモジュールに入れ、メインプログラムでモジュールを使用することです。

+0

Thanks Julien May、整数:: a(3)、b(3)、c(6)を使用すると正しく動作します @ eriktous現在、私はセグメンテーションフォールトを避けるためにモジュールメソッドを使用しましたが、これを行う良い方法は(モジュールまたはインターフェイス)ですか? –

+0

例については、この類似の質問を参照してください:http://stackoverflow.com/questions/9374691/array-and-pointer-shapes –

+0

ありがとう@ M.S.B。あなたはインターフェイスとモジュールオプションの間にお勧めしますか?現時点ではモジュールを使用しているので、インタフェースを使用する必要はありませんか? –

1

標準のFortran 90構文を使用すると、特に配列の宣言と初期化の方法に役立ちます。

program main 
implicit none 
integer, dimension(3):: a, b ,c 
a=(/3, 4, 5/) 
b=(/1, 2, 3 /) 
call sub(a,b,c) 
write(*,*)'a+b = ',c 
end program main 
関連する問題