|
|
2010/1/1(Fri) 23:22:42|NO.29679
a = "aaa,bbb,ccc,ddd"
split a,",",b
gosub *show
a = "111,222"
//sdim b,64 //手動で初期化すれば正しい結果が得られる
split a,",",b
gosub *show
stop
*show
//bの中身を表示
m = ""
foreach b
m += b(cnt)+", "
loop
mes m
return
上記のスクリプトでは、既に"aaa","bbb","ccc","ddd"が代入されている配列に、split命令で"111,222"を分割して代入しています。
このとき、"ccc","ddd"の部分が初期化されません。このことに数時間悩まされてしまいました。
これは仕様でしょうか?
|
|
2010/1/2(Sat) 02:04:43|NO.29681
これは仕様ですね
恐らく、
1回目のsplitでは、配列型変数が確保されていなかったため、
配列型変数を、確保したあとに配列の1~4までを初期化して、結果を代入しましたが、
2回目のsplitでは、もともと配列が確保されていたため、
sdim命令による配列型変数の初期化はされず、
split命令の条件に合う配列の1と2に、結果を代入しました。
よって配列の3と4は操作されずに、そのままの状態で残ったということです。
|
|
2010/1/2(Sat) 02:08:35|NO.29682
訂正です。
ここであげた数字は、適切な表現ではありませんでしたね。
正確には、0~3までの配列となりますので、
1回目のsplitでは、配列型変数が確保されていなかったため、
配列型変数を、確保したあとに配列の0~3までを初期化して、結果を代入しましたが、
2回目のsplitでは、もともと配列が確保されていたため、
sdim命令による配列型変数の初期化はされず、
split命令の条件に合う配列の0と1に、結果を代入しました。
よって配列の2と3は操作されずに、そのままの状態で残ったということです。
となります。
|
|
2010/1/2(Sat) 14:07:03|NO.29692
使い方が、おかしい気がします。
a = "aaa,bbb,ccc,ddd"
split a,",",b
mes b
a = "111,222"
split a,",",b
mes b
これだと、おかしくはありません。
ただの文字型変数を、配列変数として処理すること自体がおかしいのでは?
(文字型変数も内部的には4つの要素が有るようですが)
|
|
2010/1/2(Sat) 14:12:56|NO.29693
>>既に"aaa","bbb","ccc","ddd"が代入されている配列
a = "aaa,bbb,ccc,ddd"
は、配列ではなく文字列 "aaa,bbb,ccc,ddd" が、入っているだけです。
|
|
2010/1/2(Sat) 14:25:46|NO.29694
>>配列ではなく文字列 "aaa,bbb,ccc,ddd" が、入っているだけです。
今回の場合はbの配列に代入されるので、
セントラルさんの使い方は間違っていませんし、
>>既に"aaa","bbb","ccc","ddd"が代入されている配列
この表現も正しいです。
|
|
2010/1/2(Sat) 21:33:49|NO.29698
こういう感じですかね。
foreach 命令を使う時は、配列変数の自動拡張
を自前で監視しないと、変な動作をするかも..。
a = "aaa,bbb,ccc,ddd"
split a,",",b
p= stat
gosub *show
a = "111,222"
//sdim b,64 //手動で初期化すれば正しい結果が得られる
split a,",",b
p= stat
gosub *show
stop
*show
//bの中身を表示
m = ""
repeat p
m += b(cnt)+", "
loop
mes m
return
|
|
2010/1/3(Sun) 11:24:36|NO.29707
単純変数に受け取ることもできるわけですから、
配列の残りの要素まで面倒見てくれというのはちょっと無理があるかも。
statを無視するのも問題がありそうです。
|
|
2010/1/3(Sun) 11:57:34|NO.29708
ありがとうございます。
仕様ということで納得しました。
鉱石ラヂオさんのようにstatを保存しておく方法もあったのですが、今組んでいるスクリプトは規模が大きく複雑なもので、意味もなくソースを汚してしまうことに繋がりそうなので避けたいと思いました。
なので、今回はsplitを使う際は配列変数をsdimで初期化することで対処したいと思います。
|
|