// 先ほどとは管理を逆にしたもの、すなわち
// 1次元要素でキャラクタの人数を管理し、2次元要素で各パラメータを管理してみる
#define ctype param_lv(%1) param((%1),0); param(x,0)がLV
#define ctype param_hp(%1) param((%1),1); param(x,1)がHP
#define ctype param_mp(%1) param((%1),2); param(x,2)がMP
dim param, 5
param_lv(0) = 1,2,3,4,5; LVが5人分連続している
param_hp(0) = 10,20,30,40,50; HPが5人分連続している
param_mp(0) = 1,2,3,4,5; MPが5人分連続している
repeat 5
mes "LV"+ param_lv(cnt) + ": " +param_hp(cnt) + "/" + param_mp(cnt)
loop
// 人数が100人に増えました.100人目は99番です
param_lv(99) = 255 ; 追加できずエラー
LVの項目を5人から100人に増やすことができずエラーになりました。
原因は、各項目が連続しています。
メモリ上、LV項目の次はHP項目が連続しています。
100人にするということは、LVに続くHP項目を95人分ずらして、95人分のLV項目を空ける必要があります。
先ほどの管理方法は人数を増やした分、後ろに追加していくだけで、
既存のデータをずらす必要はありませんでした。
こちらの方法は新しい人数を増やす分、既存のデータをずらす必要がでてきます。
手間ですよね。
いくらメモリが高速でも飛び飛びにアクセスしてずらす作業は疲れます。
だからHSPは「そんな作業をさせないでくれ〜」と言ってエラーを吐きます。
「コピー用の配列を作成してデータを正しく配置して元の配列を大きくしてコピーしなおす」
モジュールを作ればいいとは言ってもHSP以上に遅く疲れます。
だから最適な方法は伸縮する次数は上位(数字の大きい方)にもってくるといいです。
既に気づいているかも知れませんが配列要素で伸縮できる次数は1つだけです。
たとえば1次元目は固定で2次元目と3次元目を可変長にしたいといっても、
2次元目を伸縮したときに3次元目のオフセットが変わるのでできません。