0

モジュールとメイン プログラムの間で配列を転送する際に問題が発生しています。モジュールとメイン プログラムは、gfortranを使用して完全に正常にコンパイルされます。ただし、.exe ファイル ウィンドウを実行すると問題が発生し、ウィンドウを閉じる必要があります。これは、配列のサイズが不明な場合 (およびそのサイズを割り当てる必要がある場合) にのみ発生するようです。問題を説明するコードの小さなセクションを含めました。

仕組み: ユーザーは、正方行列のサイズを定義する整数 'i' を求められます。この整数はモジュール関数に渡され、行列が作成されてメイン プログラムに返されます。次に、マトリックスが画面に出力されます。

1 つのファイル内のメイン プログラム:

program main1
use module1
implicit none
integer :: i
real,allocatable :: a(:,:)

write(*,*)'Input the size of the square matrix'
read(*,*)i

allocate(a(i,i))
a = function1(i)

write(*,*) 'The square matrix a='
write(*,*) a

deallocate(a)
end program main1

および別のファイル内のモジュール:

module module1

contains 
function function1(i)
real, allocatable,dimension(:,:) :: function1
integer :: i  

allocate(function1(i,i))
function1 = 1.0

deallocate(function1)
end function function1
end module 

助けてくれてありがとう!

4

2 に答える 2

4

function1関数が配列をメイン プログラムに返す前に、配列の割り当てを解除しています。ラインをなくすdeallocate(function1)と完璧に機能します。

正方行列の出力が必要な場合は、完全ではありません。書き込みステートメントは次のようにする必要があります

  do j=1,i
     write(*,*) a(:,j)
  enddo

出力を次のようにする

  1.000  1.000  1.000
  1.000  1.000  1.000
  1.000  1.000  1.000

メモリ スペースの占有が懸念される場合はfunction1、割り当てを解除するサブルーチンを作成し、設定直後に呼び出すことに注意してください。a=function1(i)

于 2013-07-02T10:42:54.317 に答える