以前、ユーザ定義関数の値渡し・参照渡しについて記事にしましたが、
抜けていた項目もありますので、再度紹介します。
ユーザ定義関数を作成する場合に、何がしかの引数(ひきすう)を持つことはよくあります。 この引数の渡し方には、値渡し(call by value)と、 参照渡し(call by reference)の2種類があります。
値渡しとは、引数で渡された値を関数内では参照・変更できるが呼出し元の変数に影響を与えない。
参照渡しとは、引数で渡された値を関数内で変更した場合、呼出し元の変数に影響を与えます。 言い方を変えれば、関数内で参照する変数は、 呼出し元の変数を直接アクセスしています。 C言語的に言えば、参照つまり変数のポインタを引数で渡すことでしょうか。
よく関数は独立性を持たせるために、値渡しが推奨されますが、参照渡しには参照渡しの良さもあります。 値渡しの値そのものは関数を呼出す時に、ユーザ定義関数用スタックに格納されます。 (スタックなので積むと表現した方がしっくりきますが)
渡される値が文字列で非常に長い場合などは、スタックの消費が多くなりますし、 値そのものをスタックにコピーされる時間が多くかかります。 これを抑えるために参照渡しにすることがあります。
また、配列データを引数で渡す時には値渡しではできなく、参照渡しにしなければなりません。 配列データは多くのメモリ領域を必要とするため、BHT-BASICではメモリもそんなに多くないので、 参照渡しの仕様にしたのだと思います。
以下のソースがその例なのですが以下の4個の関数を宣言しています。
・TestByval の名前で値渡し関数
・TestByref の名前で参照渡し関数
・TestByval2%% の名前で値渡し値を返す関数
・TestArrByref の名前で配列・参照渡し関数
このソースの実行の様子は以下の様になります。(最初のキー入力待ちまでの表示)
値渡しの関数ではWK%が変更されないことが確認できます。 また、参照渡しの関数ではWK%が変更さたことが確認できます。
その後、配列データの変更がされたことを確認する表示が以下の様になります。
転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】
■関連記事
⇒BHT-BASIC:DENSOのハンディターミナルの開発言語のBHT-BASIC4.0を使ってみた
⇒BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
⇒BHT-BASIC4.0:変数宣言の書き方その2(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数について(BHT-1300)
⇒BHT-BASIC4.0:演算子について(BHT-1300)
⇒BHT-BASIC4.0:画面への表示について(BHT-1300)
⇒BHT-BASIC4.0:キー入力について(BHT-1300)
⇒BHT-BASIC4.0:数値用キー入力関数(ユーザ定義関数)について(BHT-1300)
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数について
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその2
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその3
⇒BHT-BASIC4.0:TeraTermを使ってDENSOのハンディターミナルにファイル(プログラム)転送を行う方法
⇒BHT-BASIC4.0:I/OポートとWAIT、さらにTIMERについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
⇒BHT-BASIC4.0:データファイルの検索について(SEARCH関数)
⇒BHT-BASIC4.0:ユーザ関数の引数の仮変数に対する代入の注意点
⇒BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
⇒BHT-BASIC4.0:ファイルの存在確認関数を作ってみました
⇒BHT-BASIC4.0:拡張関数のバイナリサーチ処理関数(BSEARCH.FN3)の使い方
⇒BHT-BASIC4.0:拡張関数のサーチ処理関数(SEARCH.FN3)の使い方
⇒BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
⇒BHT-BASIC4.0:ファイル伝送におけるXFILE命令の使い方
⇒BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
⇒BHT-BASIC4.0:Bluetoothデバイスアドレス取得等について
⇒VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について
ユーザ定義関数を作成する場合に、何がしかの引数(ひきすう)を持つことはよくあります。 この引数の渡し方には、値渡し(call by value)と、 参照渡し(call by reference)の2種類があります。
値渡しとは、引数で渡された値を関数内では参照・変更できるが呼出し元の変数に影響を与えない。
参照渡しとは、引数で渡された値を関数内で変更した場合、呼出し元の変数に影響を与えます。 言い方を変えれば、関数内で参照する変数は、 呼出し元の変数を直接アクセスしています。 C言語的に言えば、参照つまり変数のポインタを引数で渡すことでしょうか。
よく関数は独立性を持たせるために、値渡しが推奨されますが、参照渡しには参照渡しの良さもあります。 値渡しの値そのものは関数を呼出す時に、ユーザ定義関数用スタックに格納されます。 (スタックなので積むと表現した方がしっくりきますが)
渡される値が文字列で非常に長い場合などは、スタックの消費が多くなりますし、 値そのものをスタックにコピーされる時間が多くかかります。 これを抑えるために参照渡しにすることがあります。
また、配列データを引数で渡す時には値渡しではできなく、参照渡しにしなければなりません。 配列データは多くのメモリ領域を必要とするため、BHT-BASICではメモリもそんなに多くないので、 参照渡しの仕様にしたのだと思います。
以下のソースがその例なのですが以下の4個の関数を宣言しています。
・TestByval の名前で値渡し関数
・TestByref の名前で参照渡し関数
・TestByval2%% の名前で値渡し値を返す関数
・TestArrByref の名前で配列・参照渡し関数
このソースの実行の様子は以下の様になります。(最初のキー入力待ちまでの表示)
値渡しの関数ではWK%が変更されないことが確認できます。 また、参照渡しの関数ではWK%が変更さたことが確認できます。
その後、配列データの変更がされたことを確認する表示が以下の様になります。
転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】
■関連記事
⇒BHT-BASIC:DENSOのハンディターミナルの開発言語のBHT-BASIC4.0を使ってみた
⇒BHT-BASIC4.0:変数宣言の書き方(BHT-1300)
⇒BHT-BASIC4.0:変数宣言の書き方その2(BHT-1300)
⇒BHT-BASIC4.0:ユーザ定義関数について(BHT-1300)
⇒BHT-BASIC4.0:演算子について(BHT-1300)
⇒BHT-BASIC4.0:画面への表示について(BHT-1300)
⇒BHT-BASIC4.0:キー入力について(BHT-1300)
⇒BHT-BASIC4.0:数値用キー入力関数(ユーザ定義関数)について(BHT-1300)
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数について
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその2
⇒BHT-BASIC4.0:文字列を扱うユーザ定義関数についてその3
⇒BHT-BASIC4.0:TeraTermを使ってDENSOのハンディターミナルにファイル(プログラム)転送を行う方法
⇒BHT-BASIC4.0:I/OポートとWAIT、さらにTIMERについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについて(BHT-1300)
⇒BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)
⇒BHT-BASIC4.0:データファイルの検索について(SEARCH関数)
⇒BHT-BASIC4.0:ユーザ関数の引数の仮変数に対する代入の注意点
⇒BHT-BASIC4.0:データファイルの削除等について(KILL、CLFILEのラッパ関数)
⇒BHT-BASIC4.0:ファイルの存在確認関数を作ってみました
⇒BHT-BASIC4.0:拡張関数のバイナリサーチ処理関数(BSEARCH.FN3)の使い方
⇒BHT-BASIC4.0:拡張関数のサーチ処理関数(SEARCH.FN3)の使い方
⇒BHT-BASIC4.0:簡単なメニュー表示・選択を行うユーザ関数について
⇒BHT-BASIC4.0:ファイル伝送におけるXFILE命令の使い方
⇒BHT-BASIC4.0:バーコードの読込み(バーコードスキャン)について
⇒BHT-BASIC4.0:Bluetoothデバイスアドレス取得等について
⇒VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について