Fortran(つまり、real*8
)配列をバイト配列として解釈し、バイトレベルで処理する関数に送ることができます。これを達成するための単純な(できればコピーなしの)方法は何ですか?Fortran配列をバイトとして再解釈する
答えて
まず、バイトレベルで機能する関数は何かが明確ではありません。 Fortran文字を使用していますか?または1バイトの整数?彼らはFortranの別の獣です。
あなたの関数のシグネチャについて嘘をついて、そのまま渡すことができます。作業する可能性がありますが、厳密には準拠していません。
Transfer()
は、類似の目的のための最も現代的なツールですが、実際に一時的なものが含まれている可能性があります。
配列のサイズが固定されている場合(それが割り当てされていないか、ポインタまたは仮引数)あなたはC.
でunion
と非常によく似ているequivalence
を使用することができます。しかし、あなたが許可されているかについて注意する必要があり、これは悪名高いドギーエリアです。 Cの組合規則さえC++の規則とは異なります。 Fortranの等価性には独自のルールがあり、より厳密には、私は恐れます。型打ちは許可されていませんが、野生のコードの多くはそれを行います。
Cのポインタを使ってトリックを行い、異なるタイプの異なるポインタから同じ配列を指すのは間違いなく標準に準拠しておらず、場合によっては期待した結果が得られます。 C++)。
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)
ではありません。
問題は、型結合にこの共用体を使用することが許可されているかどうかです。たとえば、C++では使用できません。 –
それは動作しますが、バイト計算では倍精度が破損します。私はOPがそれをしたいと思う理由を知らない。私はこれを持っている私に供給された1M回線以上のソースを持っていて、それが大事な仕事でなければすべてを取り上げるでしょう。 – Holmz
作品は2つの異なった仕様で動作することが保証されています。簡単なテストは誤解を招く可能性があり、https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30475またはhttps://gcc.gnu.org/bugzilla/show_bug.cgiのように予期せず問題が発生する可能性があります?id = 71892 GCCは、最適化のために未定義の動作を使用することで特に知られていますが、Intelはもっと控えめなものになると思っていますが、同様のことをするかもしれません。 –
- 1. Fortranの変数名として文字列を解釈する
- 2. 文字列をバイトとして解釈する方法は?
- 3. paramsキーワードは配列を単一のパラメータとして解釈し、配列の内容をすべてのパラメータとして解釈します。
- 4. Big Oループと配列の解釈
- 5. ブーストgzip解凍バイト配列
- 6. 再解釈が
- 7. Struct Javolution Libバイト配列とバイト配列
- 8. バイトをJavaの整数として再解釈するにはどうすればよいですか?
- 9. バイト配列とバイト配列リストを比較するには?
- 10. UBを発生させずに一連のバイトをPOD構造として再解釈する方法は?
- 11. 関数の戻り値を直接配列として解釈する
- 12. 画像をバイト配列としてストリーム
- 13. バイト配列を文字列としてシリアル化する
- 14. バイト配列を文字列に変換してバイト配列に戻す
- 15. C#のビットフィールドとしてのバイト配列?
- 16. .zipファイルをバイト配列に変換し、バイト配列012.prepを再作成します。
- 17. バイト配列を異なるデータ型に解凍しますか?
- 18. JadeをHTMLとして解釈する
- 19. MemoryStreamとバイト配列
- 20. numpy多次元配列の解釈
- 21. Juliaのポインタを再解釈する
- 22. xml nodeValue文字列を数字として解釈する
- 23. 整数を文字列として解釈する
- 24. バイト配列のUnicodeの解析
- 25. バイト配列を新しいプログラムとして実行する
- 26. C#文字列としてバイト配列を読み取る
- 27. PNG圧縮バイト配列をBMPバイト配列に変換する
- 28. PerlにUnicodeバイトを正しく解釈させる方法
- 29. は、Spark:rdd.RDD [(配列[バイト]、配列[バイト])]
- 30. 構造体のアライメントとタイプ再解釈
これはFortran文字を使用します。 –
MAPとUNIONも機能しますが、これはdec拡張ですが、私はfortran Characterでの作業がどのようなものか分かりません。 BYTEまたはINTEGER * 1私は理解しています....またはCHARACTERと大文字です。 – Holmz