参照渡し
 1.値渡しと参照渡し

 「HSPで関数や局所変数を使いたい」で解説したint(整数)、str(文字列)、double(実数)型の 仮引数は、値だけが渡されます。

    goto *Main
 
#module
#deffunc increment int a
    mes a+1
    return
#global

*Main
    x=10	
    increment x+2	; 12がaに渡される

 これを値渡しと言います。これに対し、特殊な引数の型としてvar(変数)を指定すると、変数そのものが渡されます。

    goto *Main
 
#module
#deffunc increment var a
    a++
    return
#global

*Main
    x=10000	
    increment x
    mes "xは"+x+"です"

 これを実行すると「xは10001です」と表示されます。「変数そのものが渡される」というとイメージしにくいかもしれませんが、 具体的には以下の通りです。

参照渡し

 仮に、xの値の格納場所が$1234番地から2バイト分(実際にはもっと多いです)だとします。10000の16進数は$2710です。これが 下位バイト、上位バイトの順に入っているとします。
 仮引数aもまたこのアドレスを参照するということです。つまり、実引数の変数xが参照しているアドレスが仮引数aに渡されるという ことで、これを参照渡しといいます。

 aの値を変えるということは、$1234番地からの内容を変えるということですから、xの値も変わります。
 int、str、double型の仮引数はあくまでも値を受け取るための器であって、変数ではないから値を変えることはできないと書きましたが、 var型は変数ですので値を変えられます。
 HSPの変数は整数も、文字列も、実数も入れられますからvar型の仮引数も同じです(こういう何型のデータでも入れられる変数の型を バリアント型といいます)。

 なお、#module、#globalではさんでいますから、「HSPで関数や局所変数を使いたい」で解説した通り この場合も仮引数名と実引数の変数名が同じでも問題ありません。

 メモリやアドレスの説明は初級編の「補講 トリビア」にあります。

 (以上はC言語風に説明したものでHSPの内部仕様は分かりません。)

 2.戻り値が2つ以上必要な場合

 関数は、戻り値を1つしか返せません。しかし、場合によっては戻り値が2つ以上必要なことがあります。その場合、var型を使う 方法があります。戻り値を入れる引数を指定すればいいのです。

    goto *Main
 
#module
#deffunc test var nibai,var sanbai,int x
    nibai=x*2
    sanbai=x*3
    return
#global

*Main
    test a,b,6	; a,b:戻り値を入れたい変数
    mes "2倍は"+a+"です"
    mes "3倍は"+b+"です"

 var型の仮引数はこのようにユーザー定義命令(またはユーザー定義関数)内で、代入ができます。また、その値は命令を呼び出した 側の実引数にも反映されるので、戻り値を入れたい変数を引数に含めることによって、戻り値を2つ以上得ることができます。



[目次へ][前へ][次へ] inserted by FC2 system