投稿
ヨッシー okkun2002
(前に色々とお騒がせしました) 配列の要素数を一気に0にするのは無理なのかな? 配列=配列はコピーじゃないらしいし、関数のなかじゃ使えない。 COPYは、要素数はコピーしないし...ウーン
2そうだね
プレイ済み
返信[1]
親投稿
ちーたけ hello.world256
DIM A[10] A=NULLY() DEF NULLY() DIM _[0] RETURN _ END
1そうだね
プレイ済み
返信[2]
親投稿
ヨッシー okkun2002
配列の=は コピーでなく 名前は違う同じ配になるらしいです。 また、関数ないで使用しても関数ないでは空になりますが関数の外に出ると戻るようです。
0そうだね
プレイ済み
返信[3]
親投稿
ちーたけ hello.world256
DIM命令で毎回「違う」要素数0の配列が作られるからこれでいーの。 動かしてみたら、ええやん?
1そうだね
プレイ済み
返信[4]
親投稿
ヨッシー okkun2002
関数のなかで使用しても動かないんです。 DEF NOARR()DIM _[0]RETURN _:END DEF A A[] A=NOARR() ?LEN(A) END DIM A[5] A A ?LEN(A)
1そうだね
プレイ済み
返信[5]
親投稿
ナツキ natukin1978
関数の引数で渡した配列に空の配列を=(イコール)で代入した場合、想定通りに動かないですね。私も以前、同じ事しました。 とりあえず、配列の要素数分POPなどの関数で削り取って対応しました。
1そうだね
プレイ済み
返信[6]
親投稿
POPしまくるしか思いつかない
1そうだね
プレイ済み
返信[7]
親投稿
ヨッシー okkun2002
やっぱループPOPか... 配列の要素数によってはループ時間が長くなるからな。30フレームとか。それを60000回ぐらいループしたら相当長くなる。
0そうだね
プレイ済み
返信[8]
親投稿
oo2 meidoin20021
ちょっとあれなやり方だけど、定義する時点で要素数指定に変数(以下変数Aとする)を使い、要素を変えたいときに変数Aを変更してから何らかの方法で定義しなおすやり方もある。あまりおすすめはしないけど。 複数の配列の場合だと、変数Aをフラグとして扱い、  A=1   DIM SX[100*A],SY[100*A] としておけば、要素数を100か0もしくは100の倍数に切り替えられる。 …なんども言うけど、おすすめはしない。やりすぎるとエラーがでるようだし。
0そうだね
プレイ済み
返信[9]
親投稿
ヨッシー okkun2002
ああーーーーーーーーさすが。なるほど。その手があったか。 だけど関数外で配列指定、関数内で変更はできない...orz
0そうだね
プレイ済み
返信[10]
親投稿
ナツキ natukin1978
いっそ引数で配列I/Oするのを止めて、引数でIn。戻り値でOutするとか。
0そうだね
プレイ済み
返信[11]
親投稿
MIKI ifconfig
現在のサイズを自分で管理すればいいだけでは?
1そうだね
プレイ済み
返信[12]
親投稿
ちーたけ hello.world256
そゆことか。 ちょっと理解が追い付かなかったや。 ならさ、 DEF N():DIM _[0]:RETURN _:END DEF A ARR$ VAR(ARR$)=N() END DIM PJ[1000] A "PJ" とかでどう? これなら簡単じゃん。 14秒で思いついた。
0そうだね
プレイ済み
返信[13]
親投稿
ヨッシー okkun2002
う、やってみます。(別に出来ても悔しくない!) でも誤動作しないかな?
0そうだね
プレイ済み
返信[14]
親投稿
ヨッシー okkun2002
DEF A A[]じゃなくてDEF A A$って事だけどそうしよう。
0そうだね
プレイ済み
返信[15]
親投稿
ちーたけ hello.world256
ごめんなさい関数内だからグローバル変数にしかうわああああ。 なので、 DEF N():DIM _[0]:RETURN _:END DEF MAIN DIM PJ[1000] PJ=N() END これで良いんじゃないでしょうか。
0そうだね
プレイ済み
返信[16]
親投稿
ちーたけ hello.world256
変に関数を一個挟まないで、直接ぶっこんだほうが早いよ。 それに処理も簡単になる。 ごめんね、惑わせちゃって。 (;>_<;)
0そうだね
プレイ済み
返信[17]
親投稿
もう解決しているようですが、原因はナツキさんが指摘している通りだと思います。関数NOARRは、OUT引数で返しているので呼び元Aの参照値Aに反映されます(実装が実体のコピーなのか参照値のコピーかは分かりません。)。しかし、命令Aの引数Aの参照値は、値渡しであり、呼び元のAとは別物になり、命令Aの中の参照値の変更は命令Aの中だけで、命令Aの呼び元の参照値Aには反映されません。(参照値Aが指している実体の変更は、反映されます。)したがって、OUT引数で返すことで、解決するはずです。例のようなグローバル変数ではなく、ローカルな配列変数の場合には、OUT引数で対応する必要があります。(通常は戻ったときに解放されるので必要性は低そうですが・・・)なお、ご存じかとは思いますが、INとOUTの仮引数を別名にして実引数を同名にすることで実装可能です。
0そうだね
プレイ済み