Fortran(merge)

mergeという言葉をずっと誤解して覚えていたので、このmerge関数も単に配列を結合するだけと思っていました。
おそらくこんな使い方だと思ったので、

aとbの結合後の配列 = merge(a,b)

下のようにプログラミングしてビルドしようとすると、

takk@deb9:~$ cat func-merge-1.f90
      program main
        integer a(3),b(3)
        data a /1,2,3/
        data b /4,5,6/

        write(*,*) 'a=',a
        write(*,*) 'b=',b
        write(*,*) 'merge=',merge(a,b)

        stop
      end
takk@deb9:~$

ビルドエラーになりました。関数の引数(mask)がないようです。

takk@deb9:~$ gfortran func-merge-1.f90
func-merge-1.f90:8:28:

         write(*,*) 'merge=',merge(a,b)
                            1
Error: Missing actual argument ‘mask’ in call to ‘merge’ at (1)
takk@deb9:~$

とりあえず全部.true.を指定してビルド、実行してみましょう。

takk@deb9:~$ cat func-merge-2.f90
      program main
        integer a(3),b(3)
        data a /1,2,3/
        data b /4,5,6/

        write(*,*) 'a=',a
        write(*,*) 'b=',b
        write(*,*) 'merge=',merge(a,b,mask=.true.)

        stop
      end
takk@deb9:~$
takk@deb9:~$ gfortran func-merge-2.f90
takk@deb9:~$ ./a.out
 a=           1           2           3
 b=           4           5           6
 merge=           1           2           3
takk@deb9:~$

おかしいです。merge=の行に表示されている配列がaの配列そのままです。
それもそのはず。マージは結合(join)ではなく、併合なので、配列サイズが変わるわけではなかったんです。どちらの配列の値を採用するかmaskで決めて配列を作り直す関数なんですね。
このように使います。

takk@deb9:~$ cat func-merge-3.f90
      program main
        integer a(3),b(3)
        data a /10,2,30/
        data b /4,50,6/

        write(*,*) 'a=',a
        write(*,*) 'b=',b
        write(*,*) 'merge=',merge(a,b,mask=a>b)

        stop
      end
takk@deb9:~$

mask=a>bなので、aの要素の方がbより大きければ、aの要素を使い、そうでなければ、bの要素を使う指定となります。要するに大きい方の値でマージするということです。
実行してみます。

takk@deb9:~$ gfortran func-merge-3.f90
takk@deb9:~$ ./a.out
 a=          10           2          30
 b=           4          50           6
 merge=          10          50          30
takk@deb9:~$

Leave a Reply

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

CAPTCHA