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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0314
ナナシ多次元配列について10未解決


ナナシ

リンク

2007/3/14(Wed) 16:31:04|NO.6281

hsp3.0での多次元配列についてなんですが

dim a,2,2
a=1,2,3,4

とするとエラーになってしまうのは仕様なのでしょうか?
2.6で上記を試してみたところ、普通にコンパイルできたのですが…



この記事に返信する


93

リンク

2007/3/14(Wed) 17:20:30|NO.6285

多分、配列の数が違うとおもいますよ
a に 1, 2, 3, 4 ということは 4つ必要ですから・・・

dim a, 4 a = 1, 2, 3, 4
ではないですか?



Irisawa

リンク

2007/3/14(Wed) 17:27:36|NO.6287

これはHSP側の配列自動拡張に不具合があるようですね。
上記のようにした場合は


dim a, 4

に拡張されないといけないはず...。
ただ、多次元配列を使用している場合、ちょっと不明確ですね。
因みに、2.xxで動作したのはHSP2.xxのコンパイラのチェックが甘いせいです。
記述としては誤りですので思いがけない誤動作の原因になる可能性があり、動作させては
いけません。



Irisawa

リンク

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

は同じようにエラーがでるので、どうやらこれは仕様(それとも不具合?)のようです。
多次元配列を使用しているときに一次元目の配列自動拡張が機能しないんですね。



naznyark

リンク

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

ということは、多次元配列を使う場合は
ひとつずつ入力していかなければならないということでしょうか?
それだとマップの作成とかがすごくめんどくさそうなんですが…



kz3

リンク

2007/3/15(Thu) 19:34:15|NO.6317

>Irisawaさん
>多次元配列を使用しているときに一次元目の配列自動拡張が機能しないんですね。

>naznyarkさん
>配列の要素数は現在の確保次元以上の次元の要素数しか自動拡張はされませんが処理速度を考慮しての仕様でしょう。

バッファの自動確保についてはこちらが参考になるかと思います。(オフセットという説明がいまいち)
http://hspwiki.nm.land.to/?%CA%D1%BF%F4%CE%CE%B0%E8%A4%CE%BC%AB%C6%B0%B3%CE%CA%DD

「バッファの自動確保できない例」として自動確保されない例を挙げていますが、実際にバッファを再確保して適切な位置に元データをコピーしていけばいいわけですが、やはりコピーの手間を省いているのでしょうね。



kz3

リンク

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を行う必要がありません。



KIMU

リンク

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



PC

リンク

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はメモリに
優しくなかった様で。

言っている事が、見当違いかもしれないけど、気になったので。



PC

リンク

2007/3/16(Fri) 10:51:13|NO.6333

どうも、dimは2次元以降、列に関しては規制が掛かるみたいだが、
行は幾らでもOKの様だねぇ。
1次元は列だけだから関係ないのかな?ふーむ・・。



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