我试图使用接口来调用具有不同类型的不同子例程,但是,当我使用指针属性时它似乎不起作用。例如,采取这个示例代码
MODULE ptr_types
TYPE, abstract :: parent
INTEGER :: q
END TYPE
TYPE, extends(parent) :: child
INTEGER :: m
END TYPE
INTERFACE ptr_interface
MODULE PROCEDURE do_something
END INTERFACE
CONTAINS
SUBROUTINE do_something(atype)
CLASS(parent), POINTER :: atype
! code determines that this allocation is correct from input
ALLOCATE(child::atype)
WRITE (*,*) atype%q
END SUBROUTINE
END MODULE
PROGRAM testpass
USE ptr_types
CLASS(child), POINTER :: ctype
CALL ptr_interface(ctype)
END PROGRAM
这给出了错误错误:在 (1) 处没有通用“ptr_interface”的特定子例程
但是,如果我删除子程序中的指针属性,它编译得很好。现在,通常这不会是一个问题,但对于我的用例,我需要能够将该参数视为一个指针,主要是我可以在必要时分配它。
有什么建议么?请注意,我是 fortran 的新手,所以我可能错过了一些东西
编辑:忘记将分配放在父母子程序中,初始输入未分配
编辑 2 这是我的第二次尝试,主叫方投射
MODULE ptr_types
TYPE, abstract :: parent
INTEGER :: q
END TYPE
TYPE, extends(parent) :: child
INTEGER :: m
END TYPE
TYPE, extends(parent) :: second
INTEGER :: meow
END TYPE
CONTAINS
SUBROUTINE do_something(this, type_num)
CLASS(parent), POINTER :: this
INTEGER type_num
IF (type_num == 0) THEN
ALLOCATE (child::this)
ELSE IF (type_num == 1) THEN
ALLOCATE (second::this)
ENDIF
END SUBROUTINE
END MODULE
PROGRAM testpass
USE ptr_types
CLASS(child), POINTER :: ctype
SELECT TYPE(ctype)
CLASS is (parent)
CALL do_something(ctype, 0)
END SELECT
WRITE (*,*) ctype%q
END PROGRAM
但是这仍然失败。在选择语句中,它抱怨父母必须扩展孩子。我确定这是由于处理指针属性时的限制,为了类型安全,但是,我正在寻找一种将指针转换为其父类型以进行通用分配的方法。而不是必须为每种类型编写单独的分配函数,并希望它们不会在接口或其他东西中发生冲突。
希望这个例子能更清楚地说明我想要实现的目标,如果你知道更好的方法,请告诉我