HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0101
セントラルsplit命令で配列が初期化されない8解決


セントラル

リンク

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"の部分が初期化されません。このことに数時間悩まされてしまいました。

これは仕様でしょうか?



この記事に返信する


Chokoko

リンク

2010/1/2(Sat) 02:04:43|NO.29681

これは仕様ですね

恐らく、
1回目のsplitでは、配列型変数が確保されていなかったため、
配列型変数を、確保したあとに配列の1~4までを初期化して、結果を代入しましたが、
2回目のsplitでは、もともと配列が確保されていたため、
sdim命令による配列型変数の初期化はされず、
split命令の条件に合う配列の1と2に、結果を代入しました。
よって配列の3と4は操作されずに、そのままの状態で残ったということです。



Chokoko

リンク

2010/1/2(Sat) 02:08:35|NO.29682

訂正です。
ここであげた数字は、適切な表現ではありませんでしたね。
正確には、0~3までの配列となりますので、

1回目のsplitでは、配列型変数が確保されていなかったため、
配列型変数を、確保したあとに配列の0~3までを初期化して、結果を代入しましたが、
2回目のsplitでは、もともと配列が確保されていたため、
sdim命令による配列型変数の初期化はされず、
split命令の条件に合う配列の0と1に、結果を代入しました。
よって配列の2と3は操作されずに、そのままの状態で残ったということです。

となります。



KA

リンク

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つの要素が有るようですが)



KA

リンク

2010/1/2(Sat) 14:12:56|NO.29693

>>既に"aaa","bbb","ccc","ddd"が代入されている配列

a = "aaa,bbb,ccc,ddd"

は、配列ではなく文字列 "aaa,bbb,ccc,ddd" が、入っているだけです。



Chokoko

リンク

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



ANTARES

リンク

2010/1/3(Sun) 11:24:36|NO.29707

 単純変数に受け取ることもできるわけですから、
配列の残りの要素まで面倒見てくれというのはちょっと無理があるかも。
statを無視するのも問題がありそうです。



セントラル

リンク

2010/1/3(Sun) 11:57:34|NO.29708

ありがとうございます。
仕様ということで納得しました。

鉱石ラヂオさんのようにstatを保存しておく方法もあったのですが、今組んでいるスクリプトは規模が大きく複雑なもので、意味もなくソースを汚してしまうことに繋がりそうなので避けたいと思いました。
なので、今回はsplitを使う際は配列変数をsdimで初期化することで対処したいと思います。



ONION software Copyright 1997-2023(c) All rights reserved.