Fortran 可分配意图(inout)参数可以是可选的吗?
我在试图定义一个子例程时遇到问题,它的参数包含一个可分配的可选intent(inout)变量,如下所示。代码编译得很好,但出现“分段错误-无效内存引用”的运行时错误 子程序测试\u例程.f90Fortran 可分配意图(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(:
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