2017-08-15 13 views
1

引数に割り当て可能な、オプションのインテント(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 

ところで、私は固定サイズのアレイを使ってみましたが、まだ助けにはなりません。そんなことはできないのだろうか?

答えて

2

ダミー引数は、オプション、割り当て可能、およびインテント(inout)にすることができます。

ただし、オプションの仮引数、PRESENTに渡すバー、または別のオプションの引数との関連付けを定義または参照することはできません。 'B'がなければ、 'B = A'を実行することはできません。

0

@lanHの答えに基づいて、私が現在把握している唯一の方法は、すべてのオプションの仮引数にエイリアスを与えることです。このバージョンは今動作します。

SUBROUTINE test_routine(A,B) 

IMPLICIT NONE 

    REAL,ALLOCATABLE,INTENT(IN) :: A(:,:) 
    REAL,ALLOCATABLE,OPTIONAL,INTENT(INOUT) :: B(:,:) 
    REAL,ALLOCATABLE    :: op_B(:,:) 

    ALLOCATE(op_B(SIZE(A,1),SIZE(A,2))) 
    op_B = A 
    op_B(:,:) = 1 

    IF(PRESENT(B)) THEN 
     B = op_B 
    END IF 

    DEALLOCATE(op_B) 

END SUBROUTINE 
関連する問題