|
|
2007/3/14(Wed) 16:31:04|NO.6281
hsp3.0での多次元配列についてなんですが
dim a,2,2
a=1,2,3,4
とするとエラーになってしまうのは仕様なのでしょうか?
2.6で上記を試してみたところ、普通にコンパイルできたのですが…
|
|
2007/3/14(Wed) 17:20:30|NO.6285
多分、配列の数が違うとおもいますよ
a に 1, 2, 3, 4 ということは 4つ必要ですから・・・
dim a, 4
a = 1, 2, 3, 4
ではないですか?
|
|
2007/3/14(Wed) 17:27:36|NO.6287
これはHSP側の配列自動拡張に不具合があるようですね。
上記のようにした場合は
dim a, 4
に拡張されないといけないはず...。
ただ、多次元配列を使用している場合、ちょっと不明確ですね。
因みに、2.xxで動作したのはHSP2.xxのコンパイラのチェックが甘いせいです。
記述としては誤りですので思いがけない誤動作の原因になる可能性があり、動作させては
いけません。
|
|
2007/3/14(Wed) 17:35:29|NO.6288
dim a, 2, 2
a(0, 0) = 1
a(0, 1) = 2
a(0, 2) = 3
a(0, 3) = 4
は 2, 4 に自動拡張されるんですね。試してみると
dim a, 2, 2
a(0, 0) = 1
a(1, 0) = 2
a(2, 0) = 3
a(3, 0) = 4
は同じようにエラーがでるので、どうやらこれは仕様(それとも不具合?)のようです。
多次元配列を使用しているときに一次元目の配列自動拡張が機能しないんですね。
|
|
2007/3/15(Thu) 01:45:12|NO.6304
配列の要素数は現在の確保次元以上の次元の要素数しか
自動拡張はされませんが処理速度を考慮しての仕様でしょう。
#define ctype alllength(%1) length(%1)+","+length2(%1)+","+length3(%1)+","+length4(%1)
dim a1, 2, 2
mes "" + alllength( a1 )
a1(0, 3) = 1
mes "" + alllength( a1 )
a1(0, 0, 0, 1) = 1
mes "" + alllength( a1 ) + "\n"
;a1(0, 5) = 1 // error
dim a2, 2, 2, 2
mes "" + alllength( a2 )
;a2(0, 3, 0) = 10 // error
a2(0, 0, 3) = 1
mes "" + alllength( a2 ) + "\n"
dim a3, 2, 2, 2, 2
mes "" + alllength( a3 )
;a3(0, 3, 0, 0) = 10 // error
;a3(0, 0, 3, 0) = 10 // error
a3(0, 0, 0, 3) = 1
mes "" + alllength( a3 ) + "\n"
|
|
2007/3/15(Thu) 19:03:34|NO.6312
ということは、多次元配列を使う場合は
ひとつずつ入力していかなければならないということでしょうか?
それだとマップの作成とかがすごくめんどくさそうなんですが…
|
|
2007/3/15(Thu) 20:04:34|NO.6318
質問は、n次元配列を一次元配列として代入を行いたいってことですよね。
dim a, 2, 2: dup da, a
da = 1, 2, 3, 4
として代入します。
>それだとマップの作成とかがすごくめんどくさそうなんですが…
面倒ですね。
だからマップエディタとかあって、マップデータをファイルに書き出します。
ファイル読み込みであれば、
a = 1, 2, 3, 4
bsave "num.dat", a
dim b, 2, 2
bload "num.dat", b
というように、dupを行う必要がありません。
|
|
2007/3/15(Thu) 20:38:38|NO.6319
>ひとつずつ入力していかなければならないということでしょうか?
>それだとマップの作成とかがすごくめんどくさそうなんですが…
dim a,2,2
a(0,0)=1,2
a(0,1)=3,4
マップチップ用の配列なら横一列づつ纏めて入れられるから特に問題ないのでは?
多次元で用意して扱い方は一次元って方が分かり難いような・・・
あと一応こんな使い方も出来る
dim a,2,2
b=1,2,3,4
memcpy a,b,4*4,0,0
repeat 2*2
mes a(cnt\2,cnt/2)
loop
|
|
2007/3/16(Fri) 10:44:54|NO.6332
えと、間違っているかもしれないが一応。
まだ、HSPは浅いから、あまり偉そうな事は書けないけど。
dim a,2,2
2次元配列ですよねぇ?
2行2列を取っている訳だから。
dim a,2,2
a=1,2,3,4
記述自体が間違っていますよ。
dim a,2
a=1,2,3,4
この書き方に作用される物であるから(1次元配列ね)
2次元なら
dim a , 2 , 2
a(0 , 0) = 0 , 1 , 2
a(0 , 1) = 0 , 1 , 1
これが、正しい書き方、だと思う。
これ以外は、どんな書き方をしてもエラーが出たので。
1次元は
dim a , 1
a = 1 , 2 , 3 , 4 ・・・
で、幾らでも入るみたいだけど2次元以降はちゃんと固定される見たいだね
(Cは要素がはみ出れば1次元だろうが2次元だろうがエラーは、出るけど
HSPはその辺が緩いみたい)。
しかし、2,6はプログラムがその記述で通ってしまうとは、Br2.6はメモリに
優しくなかった様で。
言っている事が、見当違いかもしれないけど、気になったので。
|
|
2007/3/16(Fri) 10:51:13|NO.6333
どうも、dimは2次元以降、列に関しては規制が掛かるみたいだが、
行は幾らでもOKの様だねぇ。
1次元は列だけだから関係ないのかな?ふーむ・・。
|
|