HOME > プログラミング > 命令関数の自作 > 引数とローカル変数

var array local命令関数の自作 引数とローカル変数

 

値渡し
命令や関数を使うにあたり引数を要求するとき、引数データの渡し方(伝え方)が大きく2種類あります。
値渡しは、命令や関数が呼び出された時の引数部分に変数や直接値や文字列を入れられた時、変数の値や文字列データが入ってきます。このデータは、命令関数内で使うためだけに与えられたデータです。

値渡しのサンプル
//メインプログラム(命令・関数を呼び出す)
SetErrorCode 11	//11という整数値はSetErrorCodeのcodeに代入される
SetErrorValue 3.14	//11という実数値はSetErrorValueのvalに代入される
SetErrorName "LOCK"	//LOCKという文字列はSetErrorNameのnameに代入される

//サブプログラム(命令関数群の網羅)
#module sample

//エラーデータ変数の要素名定義
#enum _ERRDATA_CODE = 0
#enum _ERRDATA_VALUE
#enum _ERRDATA_NAME
sdim _errordata,100,5	//エラーデータ文字列型変数

/*////////////////////////////////////////////////////////////////////
処理:エラーコードをセット
概要:エラーコードをセットします
引数:エラーコード
戻値:
--------------------------------------------------------------------*/
#deffunc SetErrorCode int code	//整数型の引数指定
	_errordata._ERRDATA_CODE = str(code)
return

/*////////////////////////////////////////////////////////////////////
処理:エラー値をセット
概要:エラー値をセットします
引数:エラー値
戻値:
--------------------------------------------------------------------*/
#deffunc SetErrorValue double val	//実数型の引数指定
	_errordata._ERRDATA_VALUE = str(val)
return

/*////////////////////////////////////////////////////////////////////
処理:エラー名をセット
概要:エラー名をセットします
引数:エラー名
戻値:
--------------------------------------------------------------------*/
#deffunc SetErrorName str name	//文字列型の引数指定
	_errordata._ERRDATA_NAME = name
return
#global


 

参照渡し
参照渡しは、命令や関数の呼び出し元が指示した変数(箱)を見に行きます。
呼び出された命令や関数が指定された変数を直々に見たり、直接書き換えることができます。

参照渡しのサンプル
//メインプログラム(命令・関数を呼び出す)
dim bet	//賭けた数のメーター
bet = 99999989	//現在のベットメーター
AddMeter bet,50	//betに50加算
mes "bet="+str(bet)	//・・・39

dim won,2	//当たった数のメーター配列
won.1 = 99999989	//現在のwon.1メーター
AddMeterArray won,0,30	//wonの要素0に30加算
AddMeterArray won,1,30	//wonの要素1に30加算
mes "won.0="+str(won.0)	//・・・30
mes "won.1="+str(won.1)	//・・・19


//サブプログラム(命令関数群の網羅)
#module sample
/*////////////////////////////////////////////////////////////////////
処理:メーター加算
概要:メーターを加算します、100000000を超えた分はと0から起算します
引数:メーター変数,加算値
戻値:
--------------------------------------------------------------------*/
#deffunc AddMeter var meter, int add
	meter += add	//メインプログラムのmeter変数に直接加算
	if meter >= 100000000{	//メーターの桁あふれ対策
		meter -= 100000000
	}	
return

/*////////////////////////////////////////////////////////////////////
処理:メーター加算
概要:メーターを加算します、100000000を超えた分はと0から起算します
引数:メーター配列変数,配列変数の添字,加算値
戻値:
--------------------------------------------------------------------*/
#deffunc AddMeterArray array meter, int soeji, int add
	meter.soeji += add	//メインプログラムのmeter変数に直接加算
	if meter.soeji >= 100000000{	//メーターの桁あふれ対策
		meter.soeji -= 100000000
	}	
return
#global

1つの値を扱う変数を直接操作するときは、引数の型をvarにします。
メインプログラムの配列変数を直接操作するときは引数の型をarrayにします。


 

命令や関数のローカル変数
ローカル変数は、命令や関数の処理中のみに使用できる変数です。命令や関数が多くなってくると、変数名が被ることがあります。
そこで、ローカル変数は同じ変数名を使ってもここだけの一時的な変数名として定義し、同じ変数名であってもデータを区別する仕組みです。
ローカル変数名は、ここだけのという意味を踏まえて、変数名の先頭に「_」を付けておきます。
見た目は引数のように見えますが、引数ではありません。命令や関数を呼び出す時は引数の数に注意してください。
命令や関数の実行時にローカル変数は宣言され、実行完了時にローカル変数は消滅します。

ローカル変数のサンプル
//メインプログラム(命令・関数を呼び出す)
mes LocalTest1(5)	//LocalTest1関数の結果を表示
mes LocalTest2(10)	//LocalTest2関数の結果を表示

//サブプログラム(命令関数群の網羅)
#module sample

/*////////////////////////////////////////////////////////////////////
処理:ローカル変数のテスト1
概要:同じローカル変数名_valに値を加算してvalを返す
引数:加算値
戻値:_val
--------------------------------------------------------------------*/
#defcfunc LocalTest1 int atai, local _val
	val += atai	//LocalTest1のvalにataiを加算代入(※1)
return val

/*////////////////////////////////////////////////////////////////////
処理:ローカル変数のテスト2
概要:同じローカル変数名_valに値を加算してvalを返す
引数:加算値
戻値:val
--------------------------------------------------------------------*/
#defcfunc LocalTest2 int atai, local _val
	_val += atai	//LocalTest2のvalにataiを加算代入(※1)
return _val
#global

(※1)_valという変数は2つの関数で同じ名前を使用していますが、
それぞれの関数で宣言されて完了後に消滅するので、値が引き継がれません。

当サイトコンテンツの複写・転載・引用は禁止しております。