Future BASICの変数
Future BASICは以下の種類の変数が扱えます。
この2種類の変数形式について説明しましょう。
◆グローバル変数
グローバル変数は、プログラムのどこからでも扱える便利な変数です。Future BASICは従来のBASICのような書き方もでき、また関数ごとにわけてプログラムを記述したり(構造化)する事ができます。
グローバル変数の用途はプログラムの各部から頻繁に参照されるような場合や、プログラムが終了するまで、その値(データ)を残しておきたい場合に使用します。
グローバル変数は、基本的にプログラムの先頭に書いておきます。つまり以下のように記述するとプログラム中のどこからでも参照できるようになります。
abc = 99
str$ = "By K.FuRuhata"
DIM e(88)
DIM k$(9)
END GLOBALS
abc、str$、e(〜)、k$(〜)はグローバル変数になり、どこからでも参照できます。変数を設定したら、最後にEND GLOBALSの1行を書いておきます。これにより、どこからでも参照できるようになります。
グローバル変数はプログラムのどこからでも参照できるので便利ですが、あまりに多くしてしまうといくら構造化BASICであるFuture BASICといえども管理が難しくなり、プログラムの動作不良(バグ)を引き起こしてしまう可能性が高くなってしまいます。ですから、グローバル変数は最小限の使用にとどめるべきです。
- 注意
- グローバル変数は全部で32768バイト以上使うことができません。実際はプログラムのサイズと合わせて32Kバイト以内になりますので、注意が必要です。つまりDIM a&(80000)といった使い方はできません。32Kバイトの限界まで使用するにはEND GLOBALSの命令の後にSEGMENTの一文を入れておきます。これを入れることにより32Kバイトの限界まで使用する事ができます。
◆ローカル変数
グローバル変数と対照的なものが、このローカル変数です。ローカル変数は関数の内部でのみ値を持っており、関数外では全く読み出したり書き込んだりすることはできません。つまり一時的に関数内で使用する変数です。
ローカル変数は繰り返し処理をするための変数などに使用されます。例えばFOR文で使用されたりするわけです。
ローカル変数は特に宣言したりする必要はなく、いきなり使って構いません。例えば以下のようにいきなりFOR文で使用することが出来ます。
FOR i = 2 to 19:NEXT
ローカル変数の初期値は特に指定しない限り0になります。一応の安全策としてDIMなどを使用する場合は、関数の前にCLEAR LOCAL文を入れておきます。つまり以下のようにします。
CLEAR LOCAL
DIM a%(89)
DIM rect.8
LOCAL FN sample
いろいろな処理
END FN
DIM文は特に関数外に記述する必要はありません。次のように記述しても構いません。マニュアルでは外部に記述するようになっていますので、なるべく外部に記述するようにした方がいいでしょう。なお、私のプログラムリストは私の好み(?)により全部関数の中で宣言しています。
- 注意
- 関数の処理部分とローカル変数の領域は32Kバイトまでしか扱えません。つまり処理部分と変数領域が32Kバイトを超えるようなものは駄目です。関数がそのくらい大きくなってしまうとバグの温床になりかねないので、分割するようにした方がいいでしょう。逆に変数領域が足りなくなってしまう場合は、素直に配列や変数を使用するのは避け、Macintoshに用意されている関数を使用すべきです。
◆変数の型
グローバル変数とローカル変数の2種類があるのは説明しましたが、さらに細かく見ていくと、変数の型があります。これは用途によって使い分ける方がいいでしょう。変数の型には以下のような物があります。
- 16ビット整数型(末尾に%を付ける)
- 32ビット整数型(末尾に&を付ける)
- 単精度型(末尾に!を付ける)
- 倍精度変数(末尾に#を付ける)
- 文字列型(末尾に$を付ける)
それぞれの型の変数について説明しましょう。
16ビット整数型(末尾に%を付ける)
16ビット整数型という変数は「整数演算」しかできず「-32768〜32767」までの値しか扱う事ができません。そのため、
A% = 1.23 + 0.7
という計算は1.93ではなく、ただの1になってしまいます。このような小数点を含む演算の計算結果は小数点以下は切り捨てられます。
32ビット整数型(末尾に&を付ける)
32ビット整数型という変数は「整数演算」しかできず「-2147483647〜2147483647」までの値しか扱う事はできません。小数を使用しない演算であれば、高速な演算を行うことが出来ます。また、この32ビット整数型はメモリのアドレスなどを示す変数としても使われます。
32ビット整数型も小数演算を行った場合、小数点以下が切り捨てられます。
単精度型(末尾に!を付ける)
単精度型変数は、実数演算を行う事ができます。小数を含む通常の演算はこの単精度型を使います。ただし、演算速度は16ビット、32ビット整数型と比べて遅くなります。
倍精度型(末尾に#を付ける)
倍精度型変数は単精度型の2倍の精度の演算を行うことが出来ます。通常は使用しませんが、複雑な演算や科学計算および桁落ちしては困るような計算式の場合に有効です。速度も遅いため通常の頻度は低いようです。高速な演算を行う場合はSANEを利用すると3〜5倍か、それ以上の高速化が期待できます。
Future BASIC IIはpowerMacのネイティブコードを吐き出さないため、68040エミュレーションで動作しています。次バージョンではネイティブ対応になるそうですので、そうなればかなりの高速化が期待できます。
文字列型(末尾に#を付ける)
文字列を扱う場合に使用します。例えば以下のようにして変数に文字列を入れます。
A$ = "このページの作者は古籏一浩だよ〜ん"
文字列の扱いは簡単ですが、文字列に代入できる文字列の長さは255文字までとなっています。ですから、テキストエディタ等の非常に長いデータは1つの変数には入りません。そのような場合は、配列にうまく分割するかMacintoshのToolBoxを利用します。ただしToolBoxに用意されている命令は簡単なものです。
◆変数の落とし穴
Future BASICのバグで落とし穴があるとしたら変数関係です。まず、プレファレンスの設定によって次の状態が発生します。
変数の大文字小文字を判別する
変数の末尾に何も指定しない場合、変数の型が異なる
これにより同名の変数の使用や、小数演算のミスなどが発生します。プログラムを作成する前には、必ずプレファレンスの設定を確認および設定してから取り掛かるようにしてください。
同じ変数名であっても、末尾につく記号によって、全く別の変数として扱われるので注意が必要です。例えば以下の変数は全部異なります。
a = 12
a! = 34
a% = 56
a# = 78
a$ = "abc"
Future BASICはC言語と異なり変数の型を自動的に変換してくれません。つまりa! = 9.12としてa# = 1.34とした場合、変数aが自動的に倍精度変数になるわけではありません。これら2つは全く別の変数として定義されます。