引数に割り当て可能な、オプションのインテント(inout)変数が含まれているサブルーチンを定義しようとしましたが、問題があります。コードは正常にコンパイルされますが、 "Segmentation fault - invalid memory reference"というランタイムエラーが発生します。割り当て可能なインテント(inout)引数をオプションにすることはできますか?
サブルーチンtest_routine.f90
SUBROUTINE test_routine(A,B)
IMPLICIT NONE
REAL,ALLOCATABLE,INTENT(IN) :: A(:,:)
REAL,ALLOCATABLE,OPTIONAL,INTENT(INOUT) :: B(:,:)
B = A
B(:,:) = 1
END SUBROUTINE
このサブルーチンは、モジュール内に充填され、そしてメインにと呼ばれています。
モジュールは、メインtest_main.f90
PROGRAM main
USE test_module
IMPLICIT NONE
REAL,ALLOCATABLE :: A(:,:),B(:,:)
ALLOCATE(A(6,6))
ALLOCATE(B(6,6))
A(:,:) = 0
CALL test_routine(A,B) ! WORKS FINE
CALL test_routine(A) ! DOESN'T WORK!
END PROGRAM main
は、その後、私は実際にはない、Bを補うために、別の変数op_Bを割り当てようとしました
MODULE test_module
IMPLICIT NONE
INTERFACE test_routine
MODULE PROCEDURE test_routine
END INTERFACE
END MODULE test_module
をtest_module.f90メインルーチンがそれを渡していなければ存在しますが、次のコードはまだ動作しません。
SUBROUTINE test_routine(A,B)
IMPLICIT NONE
REAL,ALLOCATABLE,INTENT(IN) :: A(:,:)
REAL,ALLOCATABLE,OPTIONAL,INTENT(INOUT) :: B(:,:)
REAL,ALLOCATABLE :: op_B(:,:)
IF(.NOT. PRESENT(B)) THEN
ALLOCATE(op_B(SIZE(A,1),SIZE(A,2)))
B = op_B
END IF
B = A
B(:,:) = 1
END SUBROUTINE
ところで、私は固定サイズのアレイを使ってみましたが、まだ助けにはなりません。そんなことはできないのだろうか?