私は、アレイを追加するサブルーチンMatPath
をしましたが、私は私がMatPath
を呼び出すサブルーチンでこの配列を宣言すべきか理解していない:サブルーチンでサイズを変更して配列を宣言するにはどうすればよいですか?
!**********************************************************************
SUBROUTINE MatPath(Path, Start)
INTEGER(2),PARAMETER::Ximax = 5, Yimax = 5, Zimax = 1
INTEGER(4)::W,B
REAL(8), DIMENSION(:,:), ALLOCATABLE::Path
REAL(8), DIMENSION(:,:), ALLOCATABLE::Temp_Array
REAL(8), DIMENSION(:), ALLOCATABLE::Start
W=SIZE(Path,DIM=2)
ALLOCATE(Temp_Array(3,W))
DEALLOCATE(Path)
ALLOCATE(Path(3,W+1))
Path(:,1:W)=Temp_Array(:,1:W)
Path(:,W+1)=Start(:)
DEALLOCATE(Temp_Array)
RETURN
END SUBROUTINE MatPath
!************************************************
SUBROUTINE FINDPATH(Array, St)
IMPLICIT NONE
INTEGER(4), DIMENSION(3,3)::Array
REAL(8), DIMENSION(3)::St
REAL(8), DIMENSION(3, :)::Path !PROBLEM HERE
CALL MatPath(Path, St)
END SUBROUTINE FINDPATH
私は配列を宣言することができますどのようにそれはまだ不明だサイズサブルーチンで修正されるだろう...誰かがそれがどのように動作するかを説明することができれば、ありがとう!
EDIT
私は私の配列A
のサイズの変更を取得し、メインプログラムのサブルーチンを終了する間にそれを渡すことができますどのようにここに私の問題の簡素化、より明確にするためには? :私はそれが私に"SIGSEV, segmentation fault occured"
を与えるか、単に任意のメッセージなしで永久に実行することを行うようにしようとすると
program teste10
REAL(8),DIMENSION(:,:),ALLOCATABLE::A
ALLOCATE(A(2,2))
A=1
WRITE(*,*), "Initial A : ", A
CALL TESTE1(A)
WRITE(*,*) "new A : ", A
DEALLOCATE(A)
STOP
end program teste10
!**********************************************
SUBROUTINE TESTE1(A)
REAL(8),DIMENSION(:,:),INTENT(INOUT), ALLOCATABLE::A
REAL(8), DIMENSION(:,:), ALLOCATABLE::Temp
INTEGER(4)::X, Y
X=SIZE(A, DIM=1)
Y=SIZE(A, DIM=2)
ALLOCATE(Temp(X,Y))
DEALLOCATE(A)
ALLOCATE(A(X+2,Y+3))
A(1:X, 1:Y)=Temp(1:X,1:Y)
A(X+1:X+2, Y+1:Y+3)=0
DEALLOCATE(Temp)
RETURN
END SUBROUTINE TESTE1
....
ありがとう、私はモジュールについての部分を理解していないのですか?私のコード全体は同じページにあり、私は他のサブルーチン、つまりメインプログラムを呼び出しています....私もやっているテストで私の投稿を編集します – Dadep
あなたは**モジュールを使用する必要があります** 。サブルーチンはモジュール内になければなりません。あるいは、サブルーチンを 'CONTAINS'と' END PROGRAM'の間で動かすこともできますが、これは短いプログラムの場合にのみ有効です。サブルーチンが同じソースファイルにあるかどうかは関係ありません。 –
配列がINTENT(OUT)の場合はどうなりますか?それは自動的にサブルーチンに割り当てられますか? – Holmz