0

コード内の障害を見つけるために valgrind を使用しています。私が使用するコマンドは

 valgrind --leak-check=yes ./a.out

コードのみでコードをコンパイルします-g。単一の書き込み行を指す多くのエラーが発生します (出力された 3 つの値は初期化され、適切に定義されています)。

write (22,*) avlength, stdlength, avenergy

すべてConditional jump or move depends on uninitialised value(s)エラーがあります。上記の行は、1 つのファイルに出力される一連の行の 2 行目です。エラーの最後に、さらに 2 つ取得します。1 つはファイルを開く行を指しています。

resStep = int(conf*100/iterate)
               if (resStep.lt.10) then
                  write (resFile, "(A5,I1)") "res00",resStep
               elseif (ResStep.lt.100) then
                  write (resFile, "(A4,I2)") "res0",resStep
               else 
                  write (resFile, "(A3,I1)") "res",resStep
               endif
               open (unit=22,file=trim(resFile),status='replace', 
     c                 action='write')

resStepは整数です。エラーはSyscall param write(buf) points to uninitialised byte(s)です。最後にAddress 0x52d83f4 is 212 bytes inside a block of size 8,344 alloc'd、ファイルをフラッシュすると (ファイルを閉じる前に) エラーが発生します。

ここにはロジックが見つかりません。問題が誤った方法でファイルを開くことにある場合、最初の行でエラーが発生しませんか?

これをコンパイルするために f95 を使用します。gcc のバージョンは 4.1.2 です。どれもアップグレードできません。

4

1 に答える 1

0

大まかな推測: のデータ型を確認してくださいresFile。文字列ですか、それともユニット番号ですか?

私の Fortran 95 はさびたものではありませんが、open()の呼び出しを write()の呼び出しの前に移動し、最初の引数としてresFileの代わりに整数のresUnitをwrite ()に渡してみてください。

CHARACTER(LEN=20):: resFile
INTEGER(KIND=2)  :: resUnit, resStep

resStep = 1
resFile = 'MY-results'
resUnit = 22
open (unit=resUnit, file=trim(resFile), status='replace', action='write')
write(resUnit, "(A5,I1)") "res00", resStep

END
于 2013-05-14T12:57:42.330 に答える