다음과 같이 각도를 변환하는 3 가지 변환 함수가 있습니다.다른 유형을 허용하는 Fortran 함수
함수 반환 값은 입력 값과 같습니다. 즉, 입력 각도가 프로그래머가 출력 을 원하는 유형이거나, 예를 들어 al = convert(Real(30),"deg_to_rad")
을 사용하여 필요한 출력 유형으로 변환하려는 유형이어야합니다.
프로그래머가 al = convert(30,"deg_to_rad")
을 수행 할 수 있기를 바랍니다. 출력 형식을 으로 정의하려면 내재적 인 transfer
전략을 사용하는 것이 좋습니다.
Real :: al, mold
al = convert(30,"deg_to_rad", mold)
al = convert(30.0,"deg_to_rad", mold)
Double Precision :: al, mold
al = convert(30,"deg_to_rad", mold)
al = convert(30.0,"deg_to_rad", mold)
내가 가진 기능이 있습니다. 좋은 계획을 구현하고 진행하는 방법에 대해 몇 가지 아이디어를 가지고있는 것이 좋을까요 .
Interface convert
Module Procedure convert
Module Procedure convert_real
Module Procedure convert_dble
Module Procedure convert_real128
End Interface convert
Contains
Function convert_real &
( &
qa, label &
) &
Result (qb)
Real, Intent (in) :: qa
Character (len=*), Intent (in) :: label
Real :: qb
If (label .contains. "angle:") Then
Block
Real :: pi, deg_to_rad
pi = 22.0/7.0
deg_to_rad = pi/180.0
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
End Select
End Block
End If
End Function convert_real
Function convert_dble &
( &
qa, label &
) &
Result (qb)
Double Precision, Intent (in) :: qa
Character (len=*), Intent (in) :: label
Double Precision :: qb
If (label .contains. "angle:") Then
Block
Double Precision :: pi, deg_to_rad
pi = Dble(22)/Dble(7)
deg_to_rad = pi/Dble(180)
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
End Select
End Block
End If
End Function convert_dble
Function convert_real128 &
( &
qa, label &
) &
Result (qb)
Real (Real128), Intent (in) :: qa
Character (len=*), Intent (in) :: label
Real (Real128) :: qb
If (label .contains. "angle:") Then
Block
Real (Real128) :: pi, deg_to_rad
pi = Real(22,Real128)/Real(7,Real128)
deg_to_rad = pi/Real(180,Real128)
Select Case (Trim (label))
Case ("angle: deg_to_rad")
qb = deg_to_rad * qa
End Select
End Block
End If
End Function convert_real128
I는 입력과 출력이 서로 다른 유형의 때 서브 루틴을 사용하는 것을 시도하고있다. 내가
Subroutine convertor &
( &
qa, label, qb &
)
Class (*), Intent (in) :: qa
Character (len=*), Intent (in) :: label
Class (*), Intent (out) :: qb
Select Type (qb)
Type Is (Real)
qb = convert (Real(qa),label)
Type Is (Double Precision)
qb = convert (Dble(qa),label)
Type Is (Real (Real128))
qb = convert (Real(qa,Real128),label)
End Select
End Subroutine convertor
아래의 오류가 발생하지만 여기에 내가 당신이 뭘 하려는지 이해한다면,이 불필요하게 복잡하게 보인다 오류
gfortran -o build/lib/foul.o -c -ffree-form -g -J./build/lib lib/foul.f
gfortran -o build/lib/meidum.o -c -ffree-form -g -J./build/lib lib/meidum.f
lib/meidum.f:890.26:
qb = convert (Real(qa),label)
1
Error: 'a' argument of 'real' intrinsic at (1) must be a numeric type
lib/meidum.f:893.26:
qb = convert (Dble(qa),label)
1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type
lib/meidum.f:896.26:
qb = convert (Real(qa,Real128),label)
1
Error: 'a' argument of 'real' intrinsic at (1) must be a numeric type
문제점 중 하나는 함수의 결과 유형에 Class (*)를 사용할 수 없다는 것입니다. 따라서 코드는 곰팡이를 사용할 수 없습니다. – Zeus