ポルノグラフィティ 『メリッサ(short ver.)』
(ポルノグラフィティ「メリッサ」)
アニメ『鋼の錬金術師』
原作とは違うのだけど、私は初代が好きです。特に錬金術師の試験に合格するシーン。うるうるきました。OPはポルノのメリッサでした。イントロのベースが最高ですね。
今回もBASIC。使う命令はOPTION BASEです。
OPTION BASEとは、配列の添字の既定の下限を宣言する命令です。
本物のQuick Basicでは0か1しか指定できませんでしたが、FreeBASIC(-lang qb)では、01以外も指定できます。
では使ってみます。OPTION BASEを1にして、わざと0番目に入れてみます。きっとコンパイルエラーになるのでしょうね。
takk@deb9:~/tmp$ cat optionbase.bas | nl -ba -i10 -v10 10 '$lang: "qb" 20 30 option base 1 40 dim array(3) 50 60 array(0) = 10 70 array(1) = 100 80 90 for i = 0 to 3 100 print "array(";i;")=";array(i) 110 next 120 takk@deb9:~/tmp$ fbc optionbase.bas
エラーでません。なぜに! 実行はどうでしょうか。
takk@deb9:~/tmp$ ./optionbase array( 0)= 10 array( 1)= 100 array( 2)= 0 array( 3)= 0 takk@deb9:~/tmp$
代入されています。何故でしょう。
もしかしたら、確保した領域を0で初期化するだけなのかもしれません。
takk@deb9:~/tmp$ cat optionbase.bas | nl -ba -i10 -v10 10 '$lang: "qb" 20 30 option base 3 40 dim array(3) 50 60 70 for i = 0 to 3 80 print "array(";i;")=";array(i) 90 next 100 takk@deb9:~/tmp$ fbc optionbase.bas takk@deb9:~/tmp$ ./optionbase array( 0)= 0 array( 1)= 5.901103e-39 array( 2)= 0 array( 3)= 0 takk@deb9:~/tmp$
なるほど、0以外の値が見えます。もっとたくさんの領域で確認してみます。
OPTION BASE 50 と0のプログラムを作ります。
takk@deb9:~/tmp$ cat optionbase50.bas | nl -ba -i10 -v10 10 '$lang: "qb" 20 30 option base 50 40 dim array(50) 50 60 for i = 0 to 50 70 print "array(";i;")=";array(i) 80 next 90 takk@deb9:~/tmp$ fbc optionbase50.bas takk@deb9:~/tmp$ ./optionbase50 > op50
takk@deb9:~/tmp$ cat optionbase0.bas | nl -ba -i10 -v10 10 '$lang: "qb" 20 30 option base 0 40 dim array(50) 50 60 for i = 0 to 50 70 print "array(";i;")=";array(i) 80 next 90 takk@deb9:~/tmp$ fbc optionbase0.bas takk@deb9:~/tmp$ ./optionbase0 > op0
両者を比べてみましょう。
takk@deb9:~/tmp$ diff -y -W40 op0 op50 array( 0)= 0 array( 0)= 0 array( 1)= 0 array( 1)= 0 array( 2)= 0 | array( 2)= 5.889 array( 3)= 0 array( 3)= 0 array( 4)= 0 array( 4)= 0 array( 5)= 0 array( 5)= 0 array( 6)= 0 | array( 6)= 5.898 array( 7)= 0 array( 7)= 0 array( 8)= 0 | array( 8)= 8.845 array( 9)= 0 array( 9)= 0 array( 10)= 0 | array( 10)= 5.89 array( 11)= 0 array( 11)= 0 array( 12)= 0 | array( 12)= 2.24 array( 13)= 0 array( 13)= 0 array( 14)= 0 | array( 14)= 8.84 array( 15)= 0 array( 15)= 0 array( 16)= 0 | array( 16)=-1.33 array( 17)= 0 | array( 17)= 4.59 array( 18)= 0 | array( 18)= 5.88 array( 19)= 0 array( 19)= 0 array( 20)= 0 array( 20)= 0 array( 21)= 0 array( 21)= 0 array( 22)= 0 | array( 22)= 5.88 array( 23)= 0 array( 23)= 0 array( 24)= 0 | array( 24)=-1.33 array( 25)= 0 | array( 25)= 4.59 array( 26)= 0 | array( 26)= 26 array( 27)= 0 | array( 27)= 1.40 array( 28)= 0 array( 28)= 0 array( 29)= 0 array( 29)= 0 array( 30)= 0 array( 30)= 0 array( 31)= 0 | array( 31)= 31 array( 32)= 0 | array( 32)=-1.33 array( 33)= 0 | array( 33)= 4.59 array( 34)= 0 | array( 34)=-1.33 array( 35)= 0 | array( 35)= 4.59 array( 36)= 0 | array( 36)= 5.60 array( 37)= 0 array( 37)= 0 array( 38)= 0 | array( 38)= 5.60 array( 39)= 0 array( 39)= 0 array( 40)= 0 | array( 40)= 1.40 array( 41)= 0 array( 41)= 0 array( 42)= 0 | array( 42)= 1.40 array( 43)= 0 array( 43)= 0 array( 44)= 0 | array( 44)= 7.00 array( 45)= 0 array( 45)= 0 array( 46)= 0 | array( 46)= 7.00 array( 47)= 0 array( 47)= 0 array( 48)= 0 | array( 48)= 5.90 array( 49)= 0 array( 49)= 0 array( 50)= 0 array( 50)= 0 takk@deb9:~/tmp$
やはり思った通りです。OPTION BASEはおそらく領域確保して、初期化する位置だけの指定でしょう。代入できてしまうので、注意が必要です。
コメント