2016-11-19 5 views

答えて

1

まず、バイトレベルで機能する関数は何かが明確ではありません。 Fortran文字を使用していますか?または1バイトの整数?彼らはFortranの別の獣です。

あなたの関数のシグネチャについて嘘をついて、そのまま渡すことができます。作業する可能性がありますが、厳密には準拠していません。

Transfer()は、類似の目的のための最も現代的なツールですが、実際に一時的なものが含まれている可能性があります。

配列のサイズが固定されている場合(それが割り当てされていないか、ポインタまたは仮引数)あなたはC.

union

と非常によく似ているequivalenceを使用することができます。しかし、あなたが許可されているかについて注意する必要があり、これは悪名高いドギーエリアです。 Cの組合規則さえC++の規則とは異なります。 Fortranの等価性には独自のルールがあり、より厳密には、私は恐れます。型打ちは許可されていませんが、野生のコードの多くはそれを行います。

Cのポインタを使ってトリックを行い、異なるタイプの異なるポインタから同じ配列を指すのは間違いなく標準に準拠しておらず、場合によっては期待した結果が得られます。 C++)。

+0

これはFortran文字を使用します。 –

+0

MAPとUNIONも機能しますが、これはdec拡張ですが、私はfortran Characterでの作業がどのようなものか分かりません。 BYTEまたはINTEGER * 1私は理解しています....またはCHARACTERと大文字です。 – Holmz

1

A「NO_COPY」方法...しかし、12月の拡張子に依存している:1は12月の拡張へのアクセス権を持っていない場合

USE ISO_C_BINDING 
IMPLICIT NONE 
UNION 
    MAP 
    REAL(KIND=C_DOUBLE) , DIMENSION(N) :: R8_Data 
    END MAP 
    MAP 
    BTYE     , DIMENSION(N*8) :: B_Data 
    END MAP 
    MAP 
    CHARACTER(LEN=1)  , DIMENSION(N*8) :: C_Data 
    END MAP 
    MAP 
    INTEGER(KIND=C_Int16_T), DIMENSION(N*4) :: I2_Data 
    END MAP 
    MAP 
    INTEGER(KIND=C_Int32_T), DIMENSION(N*2) :: I4_Data 
    END MAP 
END UNION 

@Valdimir等価でも動作します。

gfortranにMAPとUNION DEC拡張機能を追加する予定のアップグレードがありますので、時間的にもそこに追加されます。違いの私の感謝を再び軌道にある

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56226

... 一つは、構造物の内部のUNION/MAPを使用することができます。構造体/ TYPEの外側では、等価はすべて1つのニーズを満たします。ウラジミールはまた、これを言及したように

は、1つの特定の問題を持っていない限り、それは価値があるよりも、ほとんどより危険である「何のコピー」...

REAL(KIND=C_DOUBLE) , DIMENSION(N) :: R8_Data 
BTYE     , DIMENSION(N*8) :: B_Data 
CHARACTER(LEN=1)  , DIMENSION(N*8) :: C_Data 
INTEGER(KIND=C_Int16_T), DIMENSION(N*4) :: I2_Data 
INTEGER(KIND=C_Int32_T), DIMENSION(N*2) :: I4_Data 

EQUIVALENCE(R8_Data, I4_Data) 

ではありません。

+0

問題は、型結合にこの共用体を使用することが許可されているかどうかです。たとえば、C++では使用できません。 –

+0

それは動作しますが、バイト計算では倍精度が破損します。私はOPがそれをしたいと思う理由を知らない。私はこれを持っている私に供給された1M回線以上のソースを持っていて、それが大事な仕事でなければすべてを取り上げるでしょう。 – Holmz

+0

作品は2つの異なった仕様で動作することが保証されています。簡単なテストは誤解を招く可能性があり、https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30475またはhttps://gcc.gnu.org/bugzilla/show_bug.cgiのように予期せず問題が発生する可能性があります?id = 71892 GCCは、最適化のために未定義の動作を使用することで特に知られていますが、Intelはもっと控えめなものになると思っていますが、同様のことをするかもしれません。 –

関連する問題