配列変数の添え字

#module
#deffunc f var a
	sdim a@, 64, 3
	a@.0.0 = "A", "B", "C"
	a@.0.1 = "D", "E", "F"
	mes a
	return
#global

f a.1.1

オフィシャル HSP はこれで "D" が出るけど、 HSP on JS では "E"。オフィシャル HSP では変数オブジェクト(PVal)と配列を一直線に並べたときの先頭からのインデックス(APTR)で管理しているから。このサンプルでは変数 a の先頭から 4 番目というように管理している。だから変数を初期化した後の先頭から 4 番目の要素である "D" が表示される。 HSP on JS では最大四次元の配列添え字の配列(これだったら [1, 1])と変数オブジェクトをセットにしたオブジェクト(VariableAgent)で管理して、変数の値を取得したり操作したりするたびに「配列添え字の配列」から「配列を一直線に並べたときの先頭からのインデックス」への変換を行っている。これによって変数を初期化した後でも正しく「a.1.1」の要素である "E" を表示する。でも、毎回配列のインデックスを変換するのは効率悪そうだなあと思っている。

ちなみに、これを利用してオフィシャル HSP を SEGV させられる。(再現しなければ 3 をもっと大きな数字にすると再現するかも)

#module
#deffunc f var a
	sdim a@
	mes a
	return
#global

f a.3

追記(20:27 2008/10/22)

全体的に変更