2017-05-18 9 views
2

Fortranで整数を宣言すると、 INTEGER(C_INT) :: iが正しく理解されていれば、C関数に渡すことは安全です。今では常にこのように整数を宣言するという頭痛を無視して、変数をC相互運用可能と宣言しない理由はありますか?そうすることに欠点はありますか?C_INT Fortranタイプの必要性は何ですか? CとFortranの整数はどう違うのですか?

また、単純な整数の場合、C_INTは伝統的なFortranの整数と正確に何が変わるのですか? FortranとCの整数は実際に異なっていますか?

+1

は、あなたと私が使用してコンパイラに同じであってもよいが、一部はc_intの一致が – tim18

+0

をc_longの持っているかもしれませんが、なぜ、デフォルトのint型のサイズはFortranとCとの間で異なるのでしょうか?そして、おそらく、愚かなことに、私のcコードをデフォルトのintサイズのcコンパイラでコンパイルしてから、Fortranコンパイラでデフォルトのintサイズを別のサイズに設定することができました。私は 'C_INT'がこれを絶縁しているとは想像できません。 – EMiller

答えて

4

OSがCを使用してコンパイルされ、システムバインディングがCヘッダーとして公開されるため、C整数のサイズは通常固定です。オペレーティングシステムの設計者はLLP64, LP64, ILP64(64ビットポインタOS用)とCコンパイラのような一般的なモデルの1つを選択し、この選択に従います。

しかし、Fortranコンパイラはより自由です。それらを他の構成に設定することができます。 Fortranコンパイラは8バイト整数を使用するように設定されていますが、8バイトのデフォルト実数は完全に標準に準拠しています。移植性(Cも同様だろうが、それをシステムに固定されている。)

およびCおよびFortranでの整数は一致する必要はありませんので、あなたがにメカニズムを必要とするものは何でもデフォルトのC相互運用性の種類を選択種類はあります。

これは学業だけではありません。 8バイトの整数でコンパイルされたMKLのようなライブラリ(一般的なオペレーティングシステムがCでは使用しないILP64モデル)を見つけることができます。

0

基本的な欠点はなく、同じコンパイラには基本的な利点はありません。

iccでも、long intは32ビットと64ビットOSで異なりますので、知る必要があります(または、c-sideで必要なものを定義する必要があります)。

明らかに4バイトである唯一のものはC_INT32_Tなので、私が一般的に使用しているものです。さらに、C_INT32_Tを使用して固定サイズのビットサイジングにしたいと思うように定義するための "将来の校正"の努力が増えています。

これらはすべてiFortに4バイト整数を与えます。

USE ISO_C_BINDING, ONLY : C_INT, C_INT32_T 
Integer     :: 
INTEGER(KIND=4)   :: !"B" At least on iFort 
INTEGER*4     !"A" 
INTEGER(KIND=C_INT)  :: 
INTEGER(KIND=C_INT32_T) :: !"C" 

通常、「A」というスタイルの古いコードを検出します。

私は日常的に "B"のスタイルを使用していますが、これは "デファクトスタンダード"ですが、 "標準"に準拠していません。

私が移植性に懸念を抱くと、 "B"スタイルが "C"スタイルに変更され、その後、gfortranコンパイラで後でコンパイルされる可能性がある他の人たちを考慮して、他のコンパイラ。

シングルバイト:

BYTE      :: !Good 
INTEGER(KIND=1)    :: 
INTEGER(KIND=C_SIGNED_CHAR) :: 
INTEGER(KIND=C_INT8_T)  :: !Best 

2バイト:

INTEGER(KIND=2)   :: 
INTEGER(KIND=C_INT16_T) :: !Best 
INTEGER(KIND=C_SHORT)  :: 

8バイト:

INTEGER(KIND=8)   :: 
INTEGER(KIND=C_INT64_T) :: !Best 
INTEGER(KIND=C_LONG_LONG) :: 

これはやや怪しい見えますが...一つは、また言うことができる:

LOGICAL(KIND=4)   :: 
LOGICAL(KIND=C_INT32_T) :: !Best here may be C_bool and using 1-byte logical in fortran...? Assuming that there is no benefit with the size of the logical being the same as some float vector 
LOGICAL(KIND=C_FLOAT) :: 
+0

あなたは記憶容量を気にせず、それは私が作ろうとしていた点です。あなたは、しばしばいくつかのAPIとの互換性が必要です。 –

関連する問題