HSP3 プログラミングの基礎U
前へ 目次へ 次へ 

(4) ユーザ定義 3

◎ 変数の有効範囲

 ユーザ定義部とメイン部で使われる変数には、プログラム全体で共通に使える(グローバル)変数やメインとは別のものとして扱われる(ローカル)変数とがある。ここでは、変数がどの範囲で有効か(共通で使えるか)を調べる。

サンプル変数の有効範囲 (グローバル:プログラム全体で共通)

    goto *start
;-----ユーザ定義部----------
#deffunc testsub int para
    allx = para * 2
    mes "2倍は、" + allx + "です。"
    return
;-----メイン部----------
*start
    input indata
    button "判定", *han
    allx = 12345
    stop
*han
    testsub indata
    mes "allx=" + allx
    stop

実行
 変数allxに注目。
 ユーザ定義部とメイン部で変数allxを使用している。実行結果のようにユーザ定義部で代入された2倍の値がメイン部の出力命令でも表示されている。

 

サンプル変数の有効範囲 (ローカル:モジュールごとに別)

    goto *start
;-----ユーザ定義部(モジュール化)----------
#module
#deffunc testsub int para
    allx = para * 2
    mes "2倍は、" + allx + "です。"
    return
#global
;-----メイン部----------
*start
    input indata
    button "判定", *han
    allx = 12345
    stop
*han
    testsub indata
    mes "allx=" + allx
    stop

実行
 変数allxに注目。
 ユーザ定義部とメイン部で変数allxを使用している。実行結果のようにメイン部で代入された値12345がメイン部の出力命令で表示されている。

 

サンプル変数の有効範囲 (パラメータは特別)

    goto *start
;-----ユーザ定義部----------
#deffunc testsub int para
    allx = para * 2
    mes "2倍は、" + allx + "です。"
    return
;-----メイン部----------
*start
    input indata
    button "判定", *han
    allx = 12345
    stop
*han
    testsub indata
    mes "para=" + para    ;←ここでエラー
    stop

実行「無効な名前がパラメーターに指定されています」とエラーが表示されてプログラムが中断する。

試してみようユーザ定義部をモジュール化する。

    goto *start
;-----ユーザ定義部(モジュール化)----------
#module
#deffunc testsub int para
    allx = para * 2
    mes "2倍は、" + allx + "です。"
    return
#global
;-----メイン部----------
*start
    input indata
    button "判定", *han
    allx = 12345
    stop
*han
    testsub indata
    mes "para=" + para
    stop

実行
 モジュール化した部分は、独立した部分となるので、パラメータと同じ名前を使ってもエラーにはならない。

試してみようパラメータに値を代入する。(変数の使用数を減らす)

    goto *start
;-----ユーザ定義部(モジュール化)----------
#module
#deffunc testsub int 
    para = para * 2    ;←ここでエラー
    mes "2倍は、" + para + "です。"
    return
#global
;-----メイン部----------
*start
    input indata
    button "判定", *han
    allx = 12345
    stop
*han
    testsub indata
    mes "para=" + para
    stop

実行「変数名が指定されていません」とエラーが表示されてプログラムが中断する。

 


グローバル ユーザ定義部 #deffunc(#defcfunc)  名前 パラメータ
  …
  return
 変数(配列変数)は、
プログラム全体で共通
使える(参照できる)。
メイン部 *start
  …
  stop
ローカル モジュール化した
ユーザ定義部
#module
#deffunc(#defcfunc)  名前 パラメータ
  …
  return
#global
 この部分の変数(配列変数)は、
メイン部とは別のものとして
扱われる。
メイン部 *start
  …
  stop
 この部分の変数(配列変数)は、
ユーザ定義部とは別のものとして
扱われる。
パラメータ モジュール化しない #deffunc(#defcfunc)  名前 パラメータ
  …
  return
*start
  mes  パラメータ
  stop
 メイン部でパラメータと同じ名前を
使うとエラーになる
モジュール化する #module
#deffunc(#defcfunc)  名前 パラメータ
  …
  return
#global
*start
  mes  パラメータ
  stop
 モジュール化で独立するので、
メイン部でパラメータと同じ名前を
使ってもエラーにならない
代入不可
(代入できない。)
#deffunc(#defcfunc)  名前 パラメータ
  パラメータ = 値
  return
 モジュール化する、しないに
かかわらず、パラメータに値を
代入することはできない

 ◎ 推奨されない変数使用 モジュールの内と外で変数を相互に参照する方法である。このようにした場合、モジュール化する意味が薄れるので使わない方が良い。

 

前へ 目次へ 次へ 
2006  © Hiroshi Masuda 

 

 

inserted by FC2 system