BASIC(OPTION BASE)

ポルノグラフィティ 『メリッサ(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はおそらく領域確保して、初期化する位置だけの指定でしょう。代入できてしまうので、注意が必要です。

コメント

タイトルとURLをコピーしました