ハンディターミナルの開発言語であるBHT-BASIC4.0についての3回目になります。 前回は変数宣言について説明しましたが、追加でいくつかの内容を記します。
■変数宣言されない変数
コンパイラの指定で「オプション」の「宣言されていない変数をエラーにする」チェックをOFFすると 変数の宣言が無くても、変数を初めて使用した時点で変数が宣言されたことになります。
以下のソース「MODULE1.SRC」を見てください。
これを実行すると以下の表示の様になります。
コンパイラはソースの先頭からスキャンするため、 最初に関数Test1の中のWK$が出てきた時に、自動変数として宣言します。 この変数はTest1の中でのみ有効です。
Test1のすぐ下でWK$への値に代入が出てきた時点で、 このモジュール内の変数として、WK$が有効となります。
関数Test2の中でWK$を使用していますが、 これは直前のモジュール変数を参照することになります。
上記のソースを実行すると、考え方としてはCall Test1から走るような感覚です。
この例でも分かるように、自動変数を許可するとどこで変数の値が変化してしまうのかが デバッグ時に混乱してしまいます。 それで通常は、コンパイラオプションの「宣言されていない変数をエラーにする」チェックを ONにして、変数は必ず宣言する様にします。
■文字列変数について
今まで気にせずに文字列変数を宣言してきましたが、 実は文字列の格納できる長さについての制限があります。 以下のソースを見てください。
モジュール変数を例にしていますが、最初はWK1$として変数名そのままで宣言しています。 この場合、文字列として格納できる最大の文字数は 40 までです。 暗黙の了解として文字数のMAXを宣言しなければ、40なのです。これは忘れがちなので注意して下さい。
(配列変数の場合は20文字がデフォルトです)
また、この文字数の最大を超えて値を設定すると実行時エラーとして「0Fh:文字列長が範囲外です。」が発生します。 以下のソースでも7行目でエラーが発生します。
さて、2番目の宣言WK2$[10]ですが、これはWK2$の文字数が最大10であることを宣言しています。 そこで以下のソースの中で7行目をコメント行にして実行すると、当然13行目でエラーが発生します。
ちなみに、文字列の文字数宣言で最大は8192文字までです。
文字列処理はエラーが発生しない様に、文字数宣言を超えない様に文字数を大きくとるか、 または、最大文字数を超えない様な文字列連結の関数を作るかするしかないと思います。
=====
2016/04/02:の時の情報
■変数宣言されない変数
コンパイラの指定で「オプション」の「宣言されていない変数をエラーにする」チェックをOFFすると 変数の宣言が無くても、変数を初めて使用した時点で変数が宣言されたことになります。
以下のソース「MODULE1.SRC」を見てください。
'File [MODULE1.SRC] Sub Test1 WK$ = "ABC" '自動変数[WK$]宣言 Print "WK$=" + WK$ 'Test1内変数[WK$]を参照 End Sub WK$ = "123" 'モジュール変数[WK$]宣言 Sub Test2 Print "WK$=" + WK$ 'モジュール変数[WK$]を参照 WK$ = "***" 'モジュール変数[WK$]を参照・変更 Print "WK$=" + WK$ 'モジュール変数[WK$]を参照 End Sub Call Test1 'MODULE2.SRCのTest1関数をコール Call Test2 'MODULE2.SRCのTest1関数をコール Print "WK$=" + WK$ 'モジュール変数[WK$]を参照 WK$ = "@@@" '上のモジュール変数[WK$]と同じ Print "WK$=" + WK$ 'モジュール変数[WK$]を参照 Wait 0, &h01 'キー入力待ち END
これを実行すると以下の表示の様になります。
コンパイラはソースの先頭からスキャンするため、 最初に関数Test1の中のWK$が出てきた時に、自動変数として宣言します。 この変数はTest1の中でのみ有効です。
Test1のすぐ下でWK$への値に代入が出てきた時点で、 このモジュール内の変数として、WK$が有効となります。
関数Test2の中でWK$を使用していますが、 これは直前のモジュール変数を参照することになります。
上記のソースを実行すると、考え方としてはCall Test1から走るような感覚です。
この例でも分かるように、自動変数を許可するとどこで変数の値が変化してしまうのかが デバッグ時に混乱してしまいます。 それで通常は、コンパイラオプションの「宣言されていない変数をエラーにする」チェックを ONにして、変数は必ず宣言する様にします。
■文字列変数について
今まで気にせずに文字列変数を宣言してきましたが、 実は文字列の格納できる長さについての制限があります。 以下のソースを見てください。
モジュール変数を例にしていますが、最初はWK1$として変数名そのままで宣言しています。 この場合、文字列として格納できる最大の文字数は 40 までです。 暗黙の了解として文字数のMAXを宣言しなければ、40なのです。これは忘れがちなので注意して下さい。
(配列変数の場合は20文字がデフォルトです)
また、この文字数の最大を超えて値を設定すると実行時エラーとして「0Fh:文字列長が範囲外です。」が発生します。 以下のソースでも7行目でエラーが発生します。
さて、2番目の宣言WK2$[10]ですが、これはWK2$の文字数が最大10であることを宣言しています。 そこで以下のソースの中で7行目をコメント行にして実行すると、当然13行目でエラーが発生します。
'File [MODULE1.SRC] PRIVATE WK1$ WK1$ = "123" Print "WK1$=" + WK1$ 'モジュール変数[WK$]を参照 WK1$ = "0123456789012345678901234567890123456789" Print "WK1$=" + WK1$ 'モジュール変数[WK$]を参照 WK1$ = "0123456789012345678901234567890123456789@" Print "WK1$=" + WK1$ 'モジュール変数[WK$]を参照 PRIVATE WK2$[10] WK2$ = "123" Print "WK2$=" + WK2$ 'モジュール変数[WK$]を参照 WK1$ = "0123456789@" Print "WK1$=" + WK1$ 'モジュール変数[WK$]を参照 Wait 0, &h01 'キー入力待ち END
ちなみに、文字列の文字数宣言で最大は8192文字までです。
文字列処理はエラーが発生しない様に、文字数宣言を超えない様に文字数を大きくとるか、 または、最大文字数を超えない様な文字列連結の関数を作るかするしかないと思います。
=====
2016/04/02:の時の情報
PR
コメント