Fortran90(whereその3)

前回whereを使って、配列に初期値を格納したのですが、whereを使う意味はまったくありませんでした。
配列代入の意味を勘違いしていたのですが、まずは前回作った初期化のプログラムを見てみます。

takk@deb9:~$ cat where4.f90
      program main
        integer a(10)

        where (a .ne. 1)
         a = 1
        end where

        do i = 1,10
          write(*,*) a(i)
        end do

        stop
      end
takk@deb9:~$

10個の要素すべてが1に初期化されていたので正しく動いてはいたのですが、実はwhereを使う必要はありませんでした。こうすれば良いです。

takk@deb9:~$ cat where6.f90
      program main
        integer a(10)

        a = 1

        do i=1,10
          write(*,*) a(i)
        end do

        stop
      end
takk@deb9:~$

そうです。a = 1とするだけ。10個の要素すべてが1になります。
実行してみます。

takk@deb9:~$ gfortran where6.f90
takk@deb9:~$ ./a.out
           1
           1
           1
           1
           1
           1
           1
           1
           1
           1
takk@deb9:~$

whereはすごい! と糠喜びしてましたが、こうなると、whereって何に使うのだろう? と疑問符。

要素の総和とかできるでしょうか。1~10までの足し算を試みます。

takk@deb9:~$ cat where7.f90
      program main
        integer a(10),s
        data a /1,2,3,4,5,6,7,8,9,10/

        s = 0

        where(a > 0)
          s = s + a
        end where

        do i=1,10
          write(*,*) a(i)
        end do

        stop
      end
takk@deb9:~$

こんなんでいけるでしょうか。ビルドしてみます。

takk@deb9:~$ gfortran where7.f90
where7.f90:8:10:

           s = s + a
          1
Error: Incompatible ranks 0 and 1 in assignment at (1)
where7.f90:8:10:

           s = s + a
          1
Error: WHERE assignment target at (1) has inconsistent shape
takk@deb9:~$

エラーになりました。スカラー変数への代入はwhere構文内ではできないことを忘れてました。
配列代入しかできないということは、総和もできないってことですね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA