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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1212
ぴょぴょ列挙定数の不具合?発見!3解決


ぴょぴょ

リンク

2013/12/12(Thu) 16:57:17|NO.58681

現在、シューティング・ゲームを作成してます。
今まで敵機などの管理に1次元配列を使ってました。
dim enemyType,100
dim enemyX,100 dim enemyY,100
この3つの1次元配列を、1つの2次元配列にすれば、
配列の個数を減らせると思い列挙定数を使ってみました。
#enum eType=0       ;敵機のタイプ
#enum eX ;敵機の横軸 #enum eY ;敵機の縦軸 #enum MAX_PARAM *Main dim enemy,100,MAX_PARAM gosub *EnemyBirth stop *EnemyBirth foreach enemy if(enemy.cnt.eType==0){ enemy.cnt.eType=1 enemy.cnt.eX=rnd(640-32) enemy.cnt.eY=0 break } loop return
このような感じで、敵機の発生は成功しました。
しかし、次をご覧ください。
#enum eType=0       ;敵機のタイプ
#enum eX ;敵機の横軸 #enum eY ;敵機の縦軸 #enum MAX_PARAM *Main ;(1) dim enemy,100,MAX_PARAM enemy.0.0=100 enemy.0.1=200 enemy.0.2=300 Display 0,"(1)" ;(2A) dim enemy,100,MAX_PARAM enemy.0.eType=100 enemy.0.eX=200 enemy.0.eY=300 Display 0,"(2A)" ;(2B) dim enemy,100,MAX_PARAM enemy.1.eType=100 enemy.1.eX=200 enemy.1.eY=300 Display 1,"(2B)" ;(3) dim enemy,100,MAX_PARAM n=0 enemy.n.eType=100 enemy.n.eX=200 enemy.n.eY=300 Display 0,"(3)" stop #deffunc Display int _no_,str _msg_ mes _msg_ mes strf("eType=%d",enemy(_no_,0)) mes strf("eX=%d",enemy(_no_,1)) mes strf("eY=%d",enemy(_no_,2)) mes "" return
これを実行すると(2A)、(2B)は、列挙定数の eType、eX、eY が正しく評価されません。
つまり、整数値に置き変わらずに変数の参照扱いになってます。
どうやら配列の1次元「添え字」に整数値を与えると2次元「添え字」の列挙定数は正しく評価されないようだ。
これは、HSPのバグと考えて良いと思いますが、どうでしょうか。



この記事に返信する


あり

リンク

2013/12/12(Thu) 18:45:20|NO.58683

HSP3プログラミングマニュアルの配列変数の項目によれば
x.0の様な配列の記述は『HSP2までの書式と互換性がある』との事なので
『HSP3以降に追加された書式(#enum等)には対応していない』という事なのだと思います。

なのでHSP3以降の書式で記述すれば正常に動作します。

#enum eType=0 ;敵機のタイプ #enum eX ;敵機の横軸 #enum eY ;敵機の縦軸 #enum MAX_PARAM *Main ;(1) dim enemy,100,MAX_PARAM enemy.0.0=100 enemy.0.1=200 enemy.0.2=300 Display 0,"(1)" ;(2A) dim enemy,100,MAX_PARAM enemy(0,eType)=100 enemy(0,eX)=200 enemy(0,eY)=300 Display 0,"(2A)" ;(2B) dim enemy,100,MAX_PARAM enemy(1,eType)=100 enemy(1,eX)=200 enemy(1,eY)=300 Display 1,"(2B)" ;(3) dim enemy,100,MAX_PARAM n=0 enemy(n,eType)=100 enemy(n,eX)=200 enemy(n,eY)=300 Display 0,"(3)" stop #deffunc Display int _no_,str _msg_ mes _msg_ mes strf("eType=%d",enemy(_no_,0)) mes strf("eX=%d",enemy(_no_,1)) mes strf("eY=%d",enemy(_no_,2)) mes "" return



暇人

リンク

2013/12/12(Thu) 18:48:40|NO.58684

定数の前にスペースを入れたり()で囲ったりると問題無くなるからコンパイル時の解釈ミスだろう
「 . 」を使うと計算して要素数を指定したい場合必ずa.(cnt+1)みたいに()を使う必要があるのに
忘れてバグ出て、原因が分からないとかありがちなのでa()を使った方が良いかも



ぴょぴょ

リンク

2013/12/12(Thu) 19:10:13|NO.58685

[NO.58683]さんへ
> HSP3プログラミングマニュアルの配列変数の項目によれば
> x.0の様な配列の記述は『HSP2までの書式と互換性がある』との事なので
> 『HSP3以降に追加された書式(#enum等)には対応していない』という事なのだと思います。
(3)は正常なので #enum に対応してると思います。

> なのでHSP3以降の書式で記述すれば正常に動作します。
これは、分かりますね。はい。

[NO.58684]さんへ
> 定数の前にスペースを入れたり()で囲ったりると問題無くなるからコンパイル時の解釈ミスだろう
本当だ。
正常に列挙定数を解釈してます。

> 「 . 」を使うと計算して要素数を指定したい場合必ずa.(cnt+1)みたいに()を使う必要があるのに
> 忘れてバグ出て、原因が分からないとかありがちなのでa()を使った方が良いかも
C/C++の構造体のような扱いをHSPでも出来ないものかと思いましてね。
古い仕様であることを知りながらに「 . 」を使ってみたのです。



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