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:~$
コメント