沢渡さんと内容被ってますが気になったことをちょいちょい書いてみます。
まず、次のコードを実行すると分かりますが、最初の配列の個数が正しく定義できていません。
sdim a,3
mes "配列の要素数:"+length(a)
;→配列の要素数:1
; 3つの要素を持つ配列として正しく定義できていない。
a(2)=str(a(2))
;→配列の要素数:3
; a(2)に代入されたことで配列が自動拡張された。
mes "配列の要素数:"+length(a)
sdimは、
sdim p1,p2,p3...
p1=変数 : 配列を割り当てる変数名
p2=1〜 : デフォルト文字数
p3=0〜 : 要素の最大
とのことですので、
sdim a,,3
mes "配列の要素数:"+length(a)
;→配列の要素数:3
a(2)=str(a(2))
;→配列の要素数:3
mes "配列の要素数:"+length(a)
このようにする方が正しいです。
ちなみにここはエラーの直接の原因ではないので置いといて、
残りの処理の配列の要素数も見てみましょう
sdim a,,3
a(2)=str(a(2))
mes "配列の要素数:"+length(a)
;→配列の要素数:3
a=double(a)
mes "配列の要素数:"+length(a)
;→配列の要素数:1
; HSPでは配列に対して一括で処理を与えることはできない。
; 配列で添字を省略するとa(0)としているのと同じになる。
a=str(a)
mes "配列の要素数:"+length(a)
;→配列の要素数:1
コメントで入れていますがHSPでは配列に対して一括で処理を与えることは出来ません。
ループを使用してください。
sdim a,,3
a(2)=str(a(2))
mes "配列の要素数:"+length(a)
;→配列の要素数:3
foreach a: a(cnt)=double(a(cnt)): loop
mes "配列の要素数:"+length(a)
;→配列の要素数:1
foreach a: a(cnt)=str(a(cnt)): loop
mes "配列の要素数:"+length(a)
;→配列の要素数:1
ループ処理を追加しましたがまだ直っていません。
これはHSPではstrやdoubleなど、一つの配列の中に複数の型の値を持つことが不可能なためです。
よって、str用とdouble用の配列を別に用意することで解決できます。
;ddim ad,3
ad=0.0,0.0,3.14
;sdim a,,3
a="1.14","2.14","hoge"
mes "配列の要素数:"+length(a)
a(2)=str(ad(2))
foreach a: ad(cnt)=double(a(cnt)): loop
mes "配列の要素数:"+length(ad)
foreach a: a(cnt)=str(ad(cnt)): loop
mes "配列の要素数:"+length(a)
foreach a: mes a(cnt): loop
ちなみにどうしても同じ型の値を同じ配列を収めたい場合は少し複雑になりますが、
モジュール変数でコンテナを作ってモジュール型変数の配列として扱う方法もあります。
#module Val __v
#modfunc local setv var _v
__v=_v: return
#define global setv(%1,%2) %tset \
%i=%2: setv@Val %1,%o
#modcfunc v
return __v
#global
dimtype a,vartype("struct"),3
newmod a,Val: setv a(0),1.14
newmod a,Val: setv a(1),2.14
newmod a,Val: setv a(2),3.14
mes "配列の要素数:"+length(a)
setv a(2),str(v(a(2)))
foreach a: setv a(cnt),double(v(a(cnt))): loop
mes "配列の要素数:"+length(a)
foreach a: setv a(cnt),str(v(a(cnt))): loop
mes "配列の要素数:"+length(a)
foreach a: mes v(a(cnt)): loop
以上、参考になれば幸いです。