|
▼ichinose さん:
おはようございます。
昨日は(あっ今日か)、丁寧な回答ありがとうございました。途中でダウンしてしまいました。失礼しました。
無事コードも走り、おかげで、すっきりしたものにどんどん成っています。
ここの掲示板で学習したことで、見やすいコードに成っていることが自分でもわかります。(ただ、ベタ書きでないので、後で見ると何のこと?とならないかが心配です。)
以下について、「名前なし」さんの回答と併せて読ませていただきました。byvalと
byrefの違い(記憶違いも)何となく、わかったような気がします。省略すると参照渡しに成ってしまうのですね。気をつけたいと思います。
ありがとうございました。
>>値渡しと参照渡しについて。
>>確認したわけではないのでたぶんの話として。
>>sub test()
>> dim x as long
>> dim y as long
>> x=1
>> y=2
>> Call aaa(x,y)
>>' 制御を戻す番地
>> msgbox x
>>end sub
>>'========================
>>sub aaa(a as long,b as long)
>> a=a+b
>>end sub
>>
>>というコードがあったとします。
>>この場合、参照渡しです。
>>
>Call aaa(x,y)
>訂正です
>>
>>が実行された時点でスタックと呼ばれるメモリ領域が作成されます。
>>ここには、プロシジャーaaaの実行が終了したとき制御を戻す番地やパラメータの
>>番地が格納されます。
>>プロシジャーaaaでは、このスタックの情報を取得して処理が行われます。
>>参照渡しの場合は、スタックからパラメータa,bの番地(アドレス)を取得して後、
>>実際のa,bが存在する番地から値を取得します。
>>よって、この場合、
>>Msgbox x
>>で「3」が表示されます。
>>
>>sub aaa(byval a as long,byval b as long)
>> a=a+b
>>end sub
>>
>>この場合は、値渡しになります。
>>値渡しの場合、スタックには、a,bの番地ではなく、指定された値が格納されます。
>>この場合、
>>a=a+bの結果である「3」は、スタック内に格納されるはずなんです。
>>よって、x,yには、演算の結果は反映されません。
>>だって、プロシジャーaaaが終了してtestに戻ったときには、スタックは
>>解放されてしまいますから・・・。
>>
>>つまり、
>>
>>msgbox xは、「1」のまんまです。
>>
>>でも、参照渡しより、パラメータを取得するのにスタック内のアクセスのみで済むので処理が速いとされています。
>>
>>
>>たぶん、こんなしくみになっていると思いますが・・・。
|
|