忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
ハンディターミナルの開発言語であるBHT-BASIC4.0についての2回目ですが、 今回はデータ型に続いて変数宣言や、式、演算子などについて説明します。

一般的にプログラム言語で存在する、グローバル変数、モジュール変数、ローカル変数がBHT-BASICにもあります。 グローバル変数、モジュール変数とはユーザが宣言する関数の外で静的に存在する変数です。 ローカル変数とはユーザ関数の中で一時的に存在する変数のことです。

それでは各変数それぞれについて詳しくみていきます。

■グローバル変数

ユーザが宣言する関数の外で、PUBLIC または GLOBALの命令語(ステートメント) で変数を宣言すると、グローバル変数として宣言できます。
PUBLIC と GLOBALですがどちらで宣言してもいい様ですが、 それぞれ違いがあります。 まずはPUBLIC宣言のソースの例です。 この例では「MODULE1.SRC」と「MODULE2.SRC」の2つのソースがあります。 尚、プロジェクトのプロパティでメインモジュールとして「MODULE1.SRC」を指定してあります。
'File	[MODULE1.SRC]
	PUBLIC PDT1%		'グローバル変数宣言・整数型
	PUBLIC PDT2$[256]	'グローバル変数宣言・文字列型
	Declare Sub Test1	'別ソースの関数を使用する為に型宣言

Main
	PDT1% = 100		'グローバル変数に値代入
	PDT2$ = "1234567890"
	Call Test1		'MODULE2.SRCのTest1関数をコール
	Wait 0, &h01	'キー入力待ち
	END

'File	[MODULE2.SRC]

'テスト関数の宣言
	Sub Test1
		Print "PDT1%=" ; PDT1%	'グローバル変数[PDT1%]を参照
		Print "PDT2$=" + PDT2$	'グローバル変数[PDT2$]を参照
	End Sub

これを実行すると以下の表示の様になります。

PUBLIC宣言はソースファイルのどこか一カ所で行えば、 別のソースでそれを参照する場合は、宣言なしでその変数名を使えば 参照できます。

同じ変数名で別のソースでPUBLIC宣言すると二重定義エラーがリンク時に発生します。 但し、同じ変数名でもモジュール変数として宣言すれば別の変数として扱われますので、 注意が必要です。

上記のソースで宣言した、「PDT1%」「PDT2$」を今度はGLOBALで宣言します。 今回の場合は「MODULE2.SRC」の方にも同じ宣言をしないと、 リンク時に変数宣言エラーが発生します。
'File	[MODULE1.SRC]
	GLOBAL PDT1%		'グローバル変数宣言・整数型
	GLOBAL PDT2$[256]	'グローバル変数宣言・文字列型
	Declare Sub Test1	'別ソースの関数を使用する為に型宣言

Main
	PDT1% = 100		'グローバル変数に値代入
	PDT2$ = "1234567890"
	Call Test1		'MODULE2.SRCのTest1関数をコール
	Wait 0, &h01	'キー入力待ち
	END

'File	[MODULE2.SRC]
	GLOBAL PDT1%		'グローバル変数宣言・整数型
	GLOBAL PDT2$[256]	'グローバル変数宣言・文字列型

'テスト関数の宣言
	Sub Test1
		Print "PDT1%=" ; PDT1%	'グローバル変数[PDT1%]を参照
		Print "PDT2$=" + PDT2$	'グローバル変数[PDT2$]を参照
	End Sub

どちらの方法でも同じ結果になるのですが、 PUBLIC または GLOBALのどちらがいいとも言えません。
PUBLICの場合は、他のソースで宣言しなくても使えるので楽と言えば楽かもしれませんが、 変数が多くなりソースファイルの数が増えると管理が厄介です。
但し、PUBLICを宣言するところを一カ所に限定し、 変数の命名規則でPUBLICだとわかるプリフィックスを先頭に付けるのも方法かもしれません。

GLOBALはその変数を参照しているソースファイルで同じ宣言を行う必要が在ります。 この宣言を別ファイルにし、変数の宣言のみのソースとして、各ソースファイルで インクルードすることで煩雑ではなくなると思います。以下のソースがその例です。
'File	[TESTINC.INC]
	GLOBAL PDT1%		'グローバル変数宣言・整数型
	GLOBAL PDT2$[256]	'グローバル変数宣言・文字列型

'File	[MODULE1.SRC]
'$include:'TESTINC.INC'	'定数宣言ファイルインクルード
	Declare Sub Test1	'別ソースの関数を使用する為に型宣言

Main
	PDT1% = 100		'グローバル変数に値代入
	PDT2$ = "1234567890"
	Call Test1		'MODULE2.SRCのTest1関数をコール
	Wait 0, &h01	'キー入力待ち
	END

'File	[MODULE2.SRC]
'$include:'TESTINC.INC'	'定数宣言ファイルインクルード

'テスト関数の宣言
	Sub Test1
		Print "PDT1%=" ; PDT1%	'グローバル変数[PDT1%]を参照
		Print "PDT2$=" + PDT2$	'グローバル変数[PDT2$]を参照
	End Sub


■モジュール変数

ユーザが宣言する関数の外で、PRIVATE または DIMのステートメント で変数を宣言すると、モジュール変数として宣言できます。
PRIVATE 、 DIMのどちらでも効果は同じなのですが、 DIMはレジスタ変数としては宣言できない様です。
以下のソースを見てください。「MODULE2.SRC」では同じ変数名でモジュール変数を宣言しています。 「MODULE2.SRC」のモジュール変数は同じ変数名ですが、「MODULE1.SRC」とは全く異なるメモリ領域に確保されます。
'File	[MODULE1.SRC]
	PUBLIC PDT1%		'グローバル変数宣言・整数型
	PUBLIC PDT2$[256]	'グローバル変数宣言・文字列型
	Declare Sub Test1	'別ソースの関数を使用する為に型宣言

Main
	PDT1% = 100		'グローバル変数に値代入
	PDT2$ = "1234567890"
	Call Test1		'MODULE2.SRCのTest1関数をコール
	Wait 0, &h01	'キー入力待ち
	END

'File	[MODULE2.SRC]
	PRIVATE PDT1%		'モジュール変数宣言・整数型
	PRIVATE PDT2$[256]	'モジュール変数宣言・文字列型

'テスト関数の宣言
	Sub Test1
		Print "PDT1%=" ; PDT1%	'モジュール変数[PDT1%]を参照
		Print "PDT2$=" + PDT2$	'モジュール変数[PDT2$]を参照
	End Sub

これを実行すると以下の表示の様になります。 「MODULE2.SRC」のTest1関数が実行される時には、「MODULE2.SRC」内のモジュール変数として 初期化されたそれぞれの内容が表示されます。


■ローカル変数

ユーザが宣言する関数の内で、PRIVATEDIMSTATICの各ステートメント で変数を宣言すると、ローカル変数として宣言できます。

グローバル変数やモジュール変数と同じ名前でローカル変数を宣言しても、 全く別ものとして扱われます。(全く別のメモリ領域に割り当てられます)
'File	[MODULE2.SRC]
	PRIVATE PDT1%
	PRIVATE PDT2$[256]
'テスト関数の宣言
	Sub Test1
		PRIVATE PDT1%
		PRIVATE PDT2$[256]
		PDT1% = 200		'ローカル変数に値代入
		PDT2$ = "ABC"
		Print "PDT1%=" ; PDT1%	'ローカル変数[PDT1%]を参照
		Print "PDT2$=" + PDT2$	'ローカル変数[PDT2$]を参照
	End Sub

この様に組むと、関数の中から同じ名前のモジュール変数が参照できなくなります。 そのため、通常プログラムする時にモジュール変数とローカル変数は、なるべくかぶらない様にしています。



=====
2016/04/02:の時の情報











PR

コメント

コメントを書く