FORTRAN oop 기능으로 프로그래밍 중입니다. 이제 다른 서브 루틴을 인수로 사용하는 서브 루틴이 있습니다. 그러나 나는 서브 루틴이 일반적인 서브 루틴뿐 아니라 무제한 다형성 서브 루틴을 인수로 사용하기를 원한다. 예를 들어 내가 가진 :FORTRAN : 인수 및 다른 문제로 무제한 다형성 서브 루틴 전달
subroutine PassFunc(MyFunc, MyInput)
class(*), intent(inout) :: MyInput
interface
subroutine MyFunc(A, B)
class(*), intent(in) :: A
class(*), intent(out) :: B
endsubroutine MyFunc
endinterface
class(*), allocatable :: FuncRes
select type(MyInput)
type is(real(8))
allocate(real(8)::FuncRes)
select type(FuncRes)
type is(real(8))
call MyFunc(MyInput, FuncRes)
MyInput = MyInput + FuncRes**2
endselect
type is(complex(8))
endselect
endsubroutine PassFunc
!Input Functions
subroutine Func1(A, B)
class(*), intent(in) :: A
class(*), intent(out) :: B
select type(A)
type is(real(8))
select type(B)
type is(real(8))
B = A + 1
endselect
type is(complex(8))
select type(B)
type is(complex(8))
B = A - 1
endselect
endselect
endsubroutine Func1
subroutine Func2(A, B)
real(8), intent(in) :: A
real(8), intent(out) :: B
B = A + 1
endsubroutine Func2
질문 : 난 단지 "PassFunc"로 제한 다형성 서브 루틴을 통과 할 수 있어요
합니다. 나는 정상적인 함수 (클래스 (*)가없는 함수)를 전달할 수 없다. "PassFunc"가 다른 유형의 함수를 사용하도록 만들 수있는 방법이 있습니까? (예 : Func1은 작동하지만 Func2는 그렇지 않습니다.) 컴파일 할 때 불평하지 않았지만 IVF로 액세스 위반이 있습니다. 작동 가능합니까? 가능한 경우 수정하지 않고 다른 서브 루틴을 사용할 수 있습니다.)
"FuncRes"변수의 유형은 "MyInput"에 따라 다릅니다. 이제 내가 아는 유일한 방법은 중첩 된 선택 유형을 사용하는 것입니다. 그러나 실제로 "FuncRes"와 "MyInput"은 항상 같은 유형이므로 중첩 된 선택 유형을 줄이는 방법이 있습니까? (중간 변수가 많은 경우 재앙이됩니다.)
귀하의 설명에 감사드립니다. 이 게시물은 실제로 내 이전 게시물의 확장입니다. 현재 데이터 형식 차이를 숨기기 위해 부모 확장 형식을 사용하는 것이 로컬 변수 문제 때문에 더 좋은 방법입니다. 또한 래퍼가 제공되지 않으면 무제한의 다형성 서브 루틴을 사용할 수 없습니다. 향후 FORTRAN 표준에서 입력 종속 유형에 대한 업데이트가 있기를 바랍니다. – FortCpp