[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 メーリングリストの案内