[SCore-users-jp] Re: omni Fortran レポート
入谷 佳一
iriya @ crc.co.jp
2002年 7月 16日 (火) 11:13:44 JST
入谷です.
おせわになります.
申し訳ありません.報告用にメーラ上でプログラムを書いて
間違えてしまいました.
もう一度,確認いたしましたので,実行したプログラムを
記載します.
環境はRedHat7.2,Score5.0.1で,omniコンパイラが使えるようmpiを
再構築してあります.
お手数をおかけして申し訳ありませんがもう一度確認いただけますでしょうか
間違えた情報で貴重なお時間を使わせてしまい申し訳ありませんでした.
以後,気をつけます.今後ともよろしくお願いいたします.
--------------------
1. EOFをreadの"end="で検知する場合
プログラム:
program main
integer ii
open(11, file='data1.dat')
do while(.true.)
read(11, *, end = 100) ii
write(*,*) ii
end do
100 continue
open(12, file='data2.dat')
do while(.true.)
write(*,*) 'bf 2nd read'
read(12, *, end = 110) ii
write(*,*) 'aft 2nd read' ! この行に実行が移りません
write(*,*) ii
end do
110 continue
stop
end
実行状況:
# mpif77 -compiler omni -Wall a.f
!Compiling 'a.f'...
MAIN main:
# cat data1.dat
123
1234
# cat data2.dat
234
2345
23456
#./a.out
123
1234
bf 2nd read
ここで戻ってこなくなります.
# g77 d.f
# ./a.out
123
1234
bf 2nd read
aft 2nd read
234
bf 2nd read
aft 2nd read
2345
bf 2nd read
aft 2nd read
23456
bf 2nd read
#
2.EOFをread文のiostatで判定する場合
program main
integer i
open (11, file = 'data1.dat')
do while (.true.)
read (11, *, iostat=iost) i
write(*,*) 'iostat=',iost
if (iost.ne.0) then !前回mailで誤って.eq.で判定するよう書いていました.
goto 111
end if
write(*, *) i
end do
111 continue
close(11)
stop
end
# mpif77 -compiler omni -Wall a.f
Compiling 'a.f'...
MAIN main:
# ./a.out
iostat= 0
123
iostat= 0
1234
iostat= 0
1234
iostat= 0
1234
iostat= 0
1234
iostat= 0
となり,iostatに正常EOFの値(負の整数値)が入ってきません
# g77 a.f
# ./a.out
iostat= 0
123
iostat= 0
1234
iostat= -1
--------
> program main
>
> open (11, file = 'data1.dat')
> do while (.true.)
> read (11, *, iostat=iost) i
> write(*, *) i
> if (iost.eq.0) then
goto 111
> end if
> end do
> 111 continue
> close(11)
>
> end
>
> 上記すべてのコンパイラにおいて、data1.dat より、最初の 1 行を
>integer として i に read した時点でプログラムは正常終了します。
正常に読めたらループを抜けるので文法どおりの動作です
>
> また、上記コードでの変数 iost と 0 との比較ですが、1 と比較するよう
>に修正すると、おっしゃるように最後の行を読みつづけます。が、これも、前
>述の omf77 以外のコンパイラと同様の動作です。
READエラーが起こるまで無限ループであるので文法どおりの動作だと思います.
----------------------------------------
入谷 佳一 (Iriya Yoshikazu)
(株)CRCソリューションズ
エネルギー技術部 システム安全チーム
Tel. 03-5634-5803 Fax.03-5634-7338
SCore-users-jp メーリングリストの案内