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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0622
ライスカレー配列変数の自動追加14解決


ライスカレー

リンク

2010/6/22(Tue) 16:50:34|NO.33364

dim var
で宣言した配列変数は、
var(0) = 1
var(1) = 1
var(2) = 1
と順番に代入することで自動的に要素数が加算されます。

dim var, 10
で宣言した配列変数に、
var(10,0) = 1
var(10,1) = 1
var(10,2) = 1
と順番に代入することでも自動的に要素数が加算されます。

しかし、
dim var, 10
で宣言した配列変数に、
var(10,0) = 1
var(11,0) = 1
var(12,0) = 1
と代入しても自動的に要素数は加算されません。

つまり、最後の要素のみ、自動追加が可能なのですが、
途中の要素は自動的に追加されることはありません。
これを改善するにはどうしたら良いでしょうか。



この記事に返信する


SYAM

リンク

2010/6/22(Tue) 17:05:49|NO.33365

追加のタイミングで全部作り直して全要素をコピーするサブルーチンまたはモジュールを作る…かな…。



ライスカレー

リンク

2010/6/22(Tue) 17:08:39|NO.33366

速っ!

しかし、やっぱりそうなっちゃいますか…
頻繁に使うとかなりの処理時間がかかりますよね…
インデックスで値の出し入れが出来れば配列変数でなくても良いのですが…



SYAM

リンク

2010/6/22(Tue) 17:10:50|NO.33367

…でもよく見たら、

dim var, 10 var(10,0) = 1 var(10,1) = 1 var(10,2) = 1
…のとこ、さりげなく要素数増えてますね。10って11番目だし。



ライスカレー

リンク

2010/6/22(Tue) 17:22:57|NO.33368

そういえばそうだ……
何故……??
っと、調べてみました。

これはOK
dim var, 10
var(100,100) = 1
var(100,101) = 1

これはNG
dim var, 10
var(100,100) = 1
var(101,100) = 1

最初の代入のときだけは拡張されるようですね。
そういえば、要素の0番目の値が配列全体の型になるとか、そういう仕様もありますからね…



ライスカレー

リンク

2010/6/22(Tue) 20:47:55|NO.33371

とりあえずは解決済みにしますが、しっくりこない感じです。
こういった場面はかなり多くあるので、簡単にどうにかできると良いのですが…



u

リンク

2010/6/22(Tue) 21:20:40|NO.33373

そもそもHSPのバッファ拡張もコピーによる拡張だった気がします。
予め沢山確保しておくかその都度別の配列にコピーするしかないですね。



gaddew

リンク

2010/6/22(Tue) 21:42:32|NO.33375

ここ読め
#ttp://hsp.tv/play/pforum.php?mode=all&num=33364



ライスカレー

リンク

2010/6/22(Tue) 21:47:53|NO.33376

ふぇ?このスレ??
<ttp://hsp.tv/play/pforum.php?mode=all&num=33364>



gaddew

リンク

2010/6/22(Tue) 21:57:03|NO.33377

俺としたことが なんたる失態!
ここです。
#ttp://hspdev-wiki.net/?%CA%D1%BF%F4%CE%CE%B0%E8%A4%CE%BC%AB%C6%B0%B3%CE%CA%DD



ライスカレー

リンク

2010/6/22(Tue) 22:12:24|NO.33378

つまり、大切なのは、
「要素のオフセットが変わるような場合は自動確保が行われません。」
ということですね。

そして、こんな記事があるくらいなので、
配列の要素最大数を変更するような命令はないということですね。
コピーして初期化して戻す。今のところそれしかないということがわかりました。
みなさんありがとうございました。



gaddew

リンク

2010/6/22(Tue) 22:13:12|NO.33379

何でもかんでも伸縮する配列っていうのは相当メモリ効率が悪いのです。
それはHSPを使っているからとか関係なしに。

なので、C言語でいう「構造体配列」のようなものを配列で実装するためには、
伸縮する次数を後ろにもってくるとよい。


// param配列にLVとHPとMPをキャラクタごとに配列で管理する例 #define ctype param_lv(%1) param(0,(%1)); param(0,x)がLV #define ctype param_hp(%1) param(1,(%1)); param(1,x)がHP #define ctype param_mp(%1) param(2,(%1)); param(2,x)がMP // パラメータ要素の定義 // 1次元要素で各パラメータをあらわす // 2次元要素でキャラクターをあらわす // 1次元要素は固定サイズで2次元要素が可変長となる dim param, 3; 0=LV, 1=HP, 2=MP // 5人分のパラメータを設定し、表示する repeat 5,1 param_lv(cnt) = cnt param_hp(cnt) = 10*cnt param_mp(cnt) = cnt mes "LV"+ param_lv(cnt) + ": " +param_hp(cnt) + "/" + param_mp(cnt) loop



gaddew

リンク

2010/6/22(Tue) 22:47:11|NO.33380


// 先ほどとは管理を逆にしたもの、すなわち // 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次元目のオフセットが変わるのでできません。



nns

リンク

2010/6/25(Fri) 12:31:38|NO.33421

newmodじゃいかんの?
大量にやると遅いことには変わりないけど、手動でメモリコピーやるよりは楽



ライスカレー

リンク

2010/6/25(Fri) 13:46:59|NO.33422

もじゅーるをうまく使えば…?
けど次数が1つ増えたのと変わらない気が…
1つの要素については伸縮できるし…?
それとも要素ごとにモジュールを用意すれば…?
だめだ…よくわからない…TT



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