2017-08-15 23 views
1

我有問題試圖定義一個子例程,其參數包含一個可分配,可選,意圖(inout)變量如下所示。代碼編譯得很好,但得到「分段錯誤 - 無效內存引用」的運行時錯誤。可分配意圖(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_module.f90

MODULE test_module 

IMPLICIT NONE 

    INTERFACE test_routine 
     MODULE PROCEDURE test_routine 
    END INTERFACE 

END MODULE test_module 

主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 

然後我試圖分配另一個變量op_B,以彌補B,其實際上並不存在如果主例程不通過它。但是下面的代碼仍然不起作用。

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