Fortran90(whereその2)

whereを使って配列を初期化する方法を考えてみます。

配列を同じ値で初期化する場合は、たとえば1なら、こんな風に書けると思います。

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

whereのあとの a .ne. 1は常に真でもよかったかもしれませんが、書き方が分からないので、1以外なら1で初期化するようにしています。
実行してみます。

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:~$ gfortran where4.f90
takk@deb9:~$ ./a.out
           1
           1
           1
           1
           1
           1
           1
           1
           1
           1
takk@deb9:~$

1で初期化できました。

data文で初期化するのとどちらがプログラムサイズが少なくて済むでしょうか。配列数を10000ぐらいにして確認してみます。
まずはdata文を使って静的に初期化した場合。

takk@deb9:~$ cat data5.f90
      program main
        integer a(10000)
        data a /10000*1/

        write(*,*) a(5000)
        stop
      end
takk@deb9:~$ gfortran data5.f90
takk@deb9:~$ ./a.out
           1
takk@deb9:~$ ls -l a.out
-rwxr-xr-x 1 takk takk 49136 12月 20 20:34 a.out
takk@deb9:~$

簡潔に書けますね。サイズは49136。大きいです。

where文で動的に初期化した場合。

takk@deb9:~$ cat where5.f90
      program main
        integer a(10000)

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

        write(*,*) a(5000)

        stop
      end
takk@deb9:~$ gfortran where5.f90
takk@deb9:~$ ./a.out
           1
takk@deb9:~$ ls -l a.out
-rwxr-xr-x 1 takk takk 9104 12月 20 20:33 a.out
takk@deb9:~$

行数は2行増えましたが、こちらも簡潔に書けてる気がします。プログラムサイズは9104。5分の1になりました。

Leave a Reply

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

CAPTCHA