プレイ日記
配列が引数に存在する関数Aと、配列を戻り値として返す関数Bが有ったとします。 関数Aを呼び出し、その中で引数として与えた配列に関数Bを代入すると、関数Aから戻ったとき、配列が関数A呼び出し前と変わっていないように見えます。 参照渡しでは無かったのでしょうか? 関数Bの結果をどのようにして返すかを考えないといけませんね……
4そうだね
プレイ済み
返信[1]
親投稿
関数Bで配列を返して、そのときにポインタが変わったけど、呼び出し側にある配列のポインタは変わってない、ってことかな 今までの僕の認識が間違ってたっぽい
0そうだね
プレイ済み
返信[2]
親投稿
Hanzo rzsense
関数Bで返している参照は、関数Bのローカル変数のものなので、関数Bの実行終了次第、その実体がなくなってしまうのでは・・・? 関数Aの引数として与える配列は、関数Aよりも上位のスコープのものでないといけないと思います。
0そうだね
プレイ済み
返信[3]
親投稿
関数から戻る際にローカル変数の実体が消えるのはともかく、戻り値の実体までも消えるのは変だと思います。 僕が間違ってなければ、1コメで示した画像の例ではちゃんと上位のスコープだと思うんですけど……違いますかね?
0そうだね
プレイ済み
返信[4]
親投稿
マギー M191246
最初のプログラムの16行目で 配列を仮引数に代入してますけど このとき、元の引数の配列との参照が 切れるのではないかと思います。
0そうだね
プレイ済み
返信[5]
親投稿
マギー M191246
上の私の表現が変でした。 参照先が一致しなくなる。です。
0そうだね
プレイ済み
返信[6]
親投稿
マギー M191246
連投すみません。 複数の配列を加工したいとかで 戻り値の形で返せないときは、 代入ではなくCOPY命令を使うというのは どうでしょう?
1そうだね
プレイ済み
返信[7]
親投稿
プチコンの引き数で、配列の「参照渡し」と呼ばれるものは、細かい言い方をすると、配列の「参照を『値渡し』」になります。 したがって、ユーザ定義命令・関数の中では、 1)参照を書き換えるまでは、2つの参照が同じ実体を指しているため、参照を使用して書き換えた実体の値は、呼び出し元に反映されます。 2)参照を書き換えた後は、飛び出し元の参照と異なる実体を指しているため、参照を使用して書き換えた実体の値は、呼び出し元に反映されません。 2の場合、戻りに配列変数名を指定することで、呼び出し元に反映することが出来ます。(書き換え前の変更は失われます。)
0そうだね
プレイ済み
返信[8]
親投稿
個人的にはこの手のものは代入の方がやりやすい……とは言っても出来るだけ代入しない方向でも作ろうかな 参照の参照渡しは出来ないってことですね……文字列配列はどうなのか後で調べておこう
0そうだね
プレイ済み
返信[9]
親投稿
引数と戻りの両方に配列変数を指定すれば、他の言語の「参照渡し」や「INOUT」と同じ事が出来ます。 例) DEF HOGE AIN[] OUT AOUT[] DIM A[20] VAR I COPY A,AOUT FOR I=LEN(AIN) TO LEN(A)-1:A[I]=I:NEXT AOUT=A END DIM X[10] VAR I FOR I=0 TO LEN(X)-1:X[I]=I:NEXT HOGE X OUT X FOR I=0 TO LEN(X)-1:? X[I]:NEXT
3そうだね
プレイ済み
返信[10]
親投稿
[訂正]例の4行目に間違いがありました。 誤:COPY A,AOUT 正:COPY A,AIN
0そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
文字列も同じですよ def f(s) var t$=shift(s) return t$ end a$="abc": ? f(a$) これは "a" を表示し、a$ は "bc" になります。おなじロジックで def f(s) var t$=s[0] s=right$(s,len(s)-1) '文字列を新規に生成 return t$ end a$="abc": ? f(a$) これは "a" を返しますが、a$ は変化しません。
0そうだね
プレイ済み
返信[12]
親投稿
ヘルプには「文字列変数」と表記してあるため、私がこれらを配列と呼ぶことは仕方がなく
0そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
オーノー 勘違いしてました!!
0そうだね
プレイ済み