FORTRAN(変数の結合)


アニメ『ネト充のススメ』

退職してネトゲ生活。なんて羨ましい。いつかしてみたいです。自ら進んでネトゲ生活を送る主人公は、エリートニートで、つまりリア充かなと思います。
今はネトゲ内での課金はしたことがないのですが、将来のために、課金用のお金も貯めておかないとなりません。

FORTRAN続きです。また知らない仕様の発見です。長く学習している甲斐があります。
変数の結合というか、CのUNIONのような機能ですが、手元の古い77の教科書には結合とありました。配列要素の結合です。

takk@deb9:~$ cat equ1.f
      PROGRAM MAIN
      INTEGER A(5),B(5)
      EQUIVALENCE (A(1),B(1))
      A(1)=10
      WRITE(*,11111) B(1)
11111 FORMAT(I5)
      STOP
      END
takk@deb9:~$ gfortran equ1.f
takk@deb9:~$ ./a.out
   10
takk@deb9:~$

EQUIVALENCEにて配列Aと配列Bを結合しました。
Aに値を入れると、Bでも読み出せるようになります。もちろんBに値を入れてAから読み出すこともできます。シンボリックリンクみたいです。

結合する配列の位置をずらすこともできます。

takk@deb9:~$ cat equ2.f
      PROGRAM MAIN
      INTEGER A(5),B(5)
      EQUIVALENCE (A(3),B(1))
      A(3)=10
      A(4)=20
      A(5)=30
      WRITE(*,11111) B(1),B(2),B(3)
11111 FORMAT(3I5)
      STOP
      END
takk@deb9:~$ gfortran equ2.f
takk@deb9:~$ ./a.out
   10   20   30
takk@deb9:~$

上のようにA(3)とB(1)をEQUIVALENCEで結びつけると、B(2)以降もAの対応する配列と結合されます。

文字列配列も同じようにできます。結合する変数の型は合わせないといけません。

takk@deb9:~$ cat equ3.f
      PROGRAM MAIN
      CHARACTER*8 A(3),B(3)
      EQUIVALENCE (A(1),B(2))
      A(1)='111'
      A(2)='222'
      A(3)='333'
      WRITE(*,11111) B(3)
11111 FORMAT(A10)
      STOP
      END
takk@deb9:~$ gfortran equ3.f
takk@deb9:~$ ./a.out
  222
takk@deb9:~$

配列変数の結合は、変数2つ限定ではなく、多数(複数)できます。

takk@deb9:~$ cat equ4.f
      PROGRAM MAIN
      INTEGER A(5),B(5),C(5)
      EQUIVALENCE (A(1),B(2),C(3))
      A(1)=10
      A(2)=20
      A(3)=30
      WRITE(*,11111) B(3),C(5)
11111 FORMAT(2I5)
      STOP
      END
takk@deb9:~$ gfortran equ4.f
takk@deb9:~$ ./a.out
   20   30
takk@deb9:~$

Leave a Reply

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

CAPTCHA