これはニュアンスをうまくやっていくための手間と簡単な始まりです。
個人的には、私は9/5ではなく数学のために実数を使用し、モジュールを使用します。この例では、C2Farenに実数または二重整数を渡すことができ、実数型または二重型のどちらを使用するかは、インターフェイス/プロシージャによって判断されます。次に、異なる精度が必要な場合に備えて、いくつかのオプションがあります。次に、あなたのプログラムが使用n個の第2ラインを介してモジュールを使用しています
MODULE MyTEMPS
PRIVATE
DOUBLE PRECISION, PARAMETER :: C2F_ScaleFact = 1.8D0
DOUBLE PRECISION, PARAMETER :: F2C_ScaleFact = /(1.0D0/1.8D0)/
DOUBLE PRECISION, PARAMETER :: F2C_Offset = 32.0D0
PUBLIC Faren2C
INTERFACE C2Faren
MODULE PROCEDURE C2Faren_Real, C2Faren_DBL
END INTERFACE
CONTAINS
!========= REAL VERISON =========
REAL FUNCTION C2Faren_Real(c)
IMPLICIT NONE
real, INTENT(IN ) :: c
C2Faren_Real = (C*F2C_ScaleFact) + F2C_Offset
RETURN
END FUNCTION C2Faren_Real
!========= DOUBLE VERSION =========
DOUBLE PRECISION FUNCTION C2Faren_DBL(c)
IMPLICIT NONE
DOUBLE PRECISION , INTENT(IN ) :: c
C2Faren_DBL = (C*F2C_ScaleFact) + F2C_Offset
RETURN
END FUNCTION C2Faren_DBL
!========= REAL VERSION (Faren to Centigrade) =========
REAL FUNCTION faren2C(Faren)
IMPLICIT NONE
REAL, INTENT(IN ) :: Faren
faren2C = (faren - F2C_Offset)/F2C_ScaleFact
RETURN
END FUNCTION faren2C
END MODULE MyTEMPS
あなたが混在言語を行う場合にもISO_C_BINDINGを使用することができ
... ...
program Console1
USE MyTEMPS !<== Here
implicit none
real :: c, f
DOUBLE PRECISION :: Dc, Df ! No way to get Df to C or DC in the module (yet)!
print *, "enter a temperature in degrees celsius"
read *, c
write(*,10) "farenheit =", C2faren(c)
10 format(a,f10.6)
Dc = C
write(*,12) "farenheit =", C2faren(Dc)
12 format("DBL:",A,f10.6)
F = Dc
write(*,14) "Centigrade =", faren2C(F)
14 format("DBL:",A,f10.6)
end program Console1
ので、/とモジュールの主な利点は、あなたがさまざまなプログラムでこのようなものを使いたいときに終わり、モジュールを一度テストして並べ替えることです...通常、この種のもの(モジュールがたくさんあります)をライブラリに入れます。モジュールには多くの機能があります。
実際のパラメータ:: ikind = selected_real_kind(p = 15)をモジュールに入れて、プログラムと関数の両方で使用することもできます。あなたは本当に近いですし、それは主にスタイルと実用性の問題です。
インテルFortranの場合は、REAL(KIND = 4)とREAL(KIND = 8)を使用できます。これはgfortranに移植できないため、ISO_C_BINDINGを使用する方が良いでしょう。 REALとDOUBLE PRECISIONを使用してください。
'implicit none'を関数本体に追加すると、' real function faren'で部分的に取り上げるヒントが得られます。あなたのコンパイラは 'real'と' real(kind = ikind) 'が同じではないと言っています。定義は一貫しており、状況は良好です。 [明示的なインタフェースを利用できるようにすると、モジュールや内部関数についての情報が得られます。] – francescalus