Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 可分配意图(inout)参数可以是可选的吗?_Fortran_Optional_Allocatable Array - Fatal编程技术网

Fortran 可分配意图(inout)参数可以是可选的吗?

Fortran 可分配意图(inout)参数可以是可选的吗?,fortran,optional,allocatable-array,Fortran,Optional,Allocatable Array,我在试图定义一个子例程时遇到问题,它的参数包含一个可分配的可选intent(inout)变量,如下所示。代码编译得很好,但出现“分段错误-无效内存引用”的运行时错误 子程序测试\u例程.f90 SUBROUTINE test_routine(A,B) IMPLICIT NONE REAL,ALLOCATABLE,INTENT(IN) :: A(:,:) REAL,ALLOCATABLE,OPTIONAL,INTENT(INOUT) :: B(:

我在试图定义一个子例程时遇到问题,它的参数包含一个可分配的可选intent(inout)变量,如下所示。代码编译得很好,但出现“分段错误-无效内存引用”的运行时错误

子程序测试\u例程.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
MODULE test_module

IMPLICIT NONE

    INTERFACE test_routine
        MODULE PROCEDURE test_routine
    END INTERFACE

END MODULE test_module
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
此子例程打包在模块中,并在Main中调用

模块测试\u模块.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
MODULE test_module

IMPLICIT NONE

    INTERFACE test_routine
        MODULE PROCEDURE test_routine
    END INTERFACE

END MODULE test_module
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
主测试\u Main.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
MODULE test_module

IMPLICIT NONE

    INTERFACE test_routine
        MODULE PROCEDURE test_routine
    END INTERFACE

END MODULE test_module
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,如果主例程不传入它,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

顺便说一下,我也尝试过使用固定大小的数组,但仍然没有帮助。我想知道这样做是否不可能?

伪参数可以是可选的、可分配的和意图(inout)


但您不允许定义或引用可选伪参数,除非将其传递给其他可选参数或将其与其他可选参数关联。如果“B”不存在,则无法执行“B=A”。

根据@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