インターフェイスを使用して、さまざまなタイプのさまざまなサブルーチンを呼び出そうとしていますが、ポインター属性を使用すると機能しないようです。たとえば、このサンプルコードを見てください
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
これによりエラーが発生します Error: There is no specific subroutine for the generic 'ptr_interface' at (1)
ただし、サブルーチンでポインター属性を削除すると、正常にコンパイルされます。さて、通常これは問題にはなりませんが、私のユースケースでは、主に必要に応じて割り当てることができるように、その引数をポインターとして扱うことができる必要があります。
助言がありますか?私はfortranに慣れていないので、何かを見落としているかもしれません
編集:親サブルーチンに割り当てを入れるのを忘れました。最初の入力は割り当てられていません
EDIT 2これは、発信者側のキャストを使用した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
ただし、これはまだ失敗します。selectステートメントでは、親が子を拡張する必要があると不平を言っています。これは、型の安全性のためにポインター属性を扱うときの制限によるものだと確信していますが、ジェネリック割り当てのためにポインターをその親型に変換する方法を探しています。型ごとに個別の割り当て関数を作成し、それらがインターフェイスなどで衝突しないようにする必要はありません。
うまくいけば、この例は、私が達成しようとしていることをもう少し明確に示しています。より良い方法を知っているなら、私に知らせてください