2016-11-29 7 views
0

fortran-77で書かれた少し古いプログラムを使用する必要があります。このプログラムは、16進形式のテキストファイルから10個の変数FortranはファイルからhexadicalをASCIIとして読み込みます

open (2,file=filename, status='old', iostat=ios) 
read (2,1) my_variables 
1 format (/(10z8)) 

そして、もう一つの変数は、文字列(文字* 4)で読み取って、私は「ANIP」に進で「414E4950」のようななめらかを取得したいです。 しかし、問題は、ファイルからデータを読み込もうとするときにエラーが発生することです。

Fortran runtime error: Value overflowed during integer read 

どうすれば解決できますか?

編集

私は問題をあまりにも単純化したようです。 は、私は次のようになり、データファイルがあります。

DATA_BLOCK_NAME 

    3D3  1 23BE  0  0  0  0  0  0  0 
     041200000414E4950  03F800000  0  16 23BF  0  0 
     0  0  0  0  0  041200000414E4950  03F800000 
     0  1E 23C0  0  0  0  0  0  0  0 

を、私は、変数に、このデータを読むことをお勧めします。

 read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i), 
+  name(i),var_4(i),var_5(i),var_6(i),i=1,obj_num) 

obj_numは整数* 4 VAR_1である* 4 VAR_2、var_3、var_4、var_5、var_6は実数 が、の配列である整数の配列です(!)の名前は、文字列の配列(文字* 4)

です

コードファイルのオブジェクト名(例: '414E4950'から 'ANIP')ごとに12番目の値ごとにデータファイルに表示されているように、文字列として保存します。

P.S.

プログラムを修復するには、ちょっとでも非常に汚い修正を書きました。 tmpは整数* 4配列とtmp_strある

read (2,1) obj_num,((var_1(j,i),j=1,7),(var_2(j,i),j=1,3),var_3(i), 
+  tmp(i),var_4(i),var_5(i),var_6(i),i=1,obj_num) 

    do j=1,numcn 
    do i=1,4 
     tmp_name(i:i) = CHAR(MOD(tmp(j), 256)) 
     tmp(j) = RSHIFT(tmp(j), 8) 
    end do 
    ccns(j) = tmp_name 
    end do 

は文字* 4 それは醜いが、働いています。答えた人に感謝!

+1

「1つの変数は文字列」とはどういう意味ですか? 'Z'編集記述子は数値型です。おそらく、あなたは 'my_variables'が本当に何であるか、それがどのように宣言されるのかを示すことができますか? – francescalus

+0

私はこの声明(私は研究室の中学生であり、fortranを知らない;)read(2、1)は10個の数値を読み、それをリストの変数に代入しようとする。整数* 4または浮動小数点* 8)であるが、文字* 4型を持つもの – Vladislav

+0

'Z'がFortran 77にないため、少し複雑になる。あなたが本当にF77コンパイラのためにあると主張するプログラムを持っているなら、それは 'Z'の別の解釈を許すことを意味するかもしれません。しかし、標準のFortranでは、 'Z'は整数、実数、および複素数変数のみで入力に使用できます。変数のリストは、フォーマットと一致する必要があります。文字変数を読み込みたい場合は、その変数をそのフォーマットの適切なエントリとマッチさせる必要があります。 – francescalus

答えて

0

my_variablesが整数と宣言されているため、フォーマットが正しく表示されないため、エラーが表示されます。したがって、16進ではなくファイルから整数を読み取ろうとしています。そしてちょうど偶然、値414E4950は整数として読み取られ、Fortranが処理できない膨大な数に過ぎません。したがって、エラー。

フォーマットを1 format (10z8)に変更します。スラッシュは、現在のレコードの終わりに達したことを示し、新しい行にジャンプする他のすべてをスキップします。したがって、書式指定の始めにそれを使用することは、まともに見えません。また

は、あなたが例えば使用すべき異なるデータ型を持つ10個の変数を読むには:

read (2,1), my_string_variable, my_variables(1), my_variables(2), my_variables(3), my_variables(4), my_variables(5), my_variables(6), my_variables(7), my_variables(8), my_variables(9) 

最後に、あなたはおそらくDATAステートメントを使用する必要があります。

+0

私はこの答えのほとんどに同意しませんが、16進数 '414E4950'は符号付き32ビット整数の範囲内にある10進数 '1095649616 'のみです。 –

+0

私は、形式が正しくないので、16進ではなく整数を読み込もうとしていたことを意味しています。したがって、整数として読み取られた '414E4950'は範囲内にありません。 –

+0

これを編集してより明確にします。 –

関連する問題