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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0602
初心者マクロの書き方を知りたい3解決


初心者

リンク

2021/6/2(Wed) 12:31:05|NO.92988

はじめましての方ははじめまして。
以前、自作のフォント表示スクリプトのことで質問させていただいた者です。

自作ゲームのデータ入力を簡潔にするために、#defineを使ってシンプルな書き方になるようにしたいのですが、
うまく関数内のデータを参照することができません。
"0"という数値を渡してやれば0番目のデータが、"1"という数値なら1番目のデータが表示される想定でコードを書いていたのですが、
何故か0番目のデータしか参照できなくて困っております・・・

ヘルプを見てもよくわからず、ネットの解説を見てもいまいちわからないので、
どなたか詳しい方がいらっしゃいましたらご教授くださいませ。

;データベース実装テスト
;------------------ #module "db_test" ;マクロ定義 #enum global db_title = 0 #enum global db_comment #enum o = -1;0からカウントさせるためのダミー定義 #define itemname(%1) #enum global %1 %c case %1 #undef title #define title(%1="未設定") if type=db_title : return %1 #define comment(%1="未設定") if type=db_comment : return %1 ;関数 #defcfunc database int type,int id switch id ;これらのデータは仮です itemname db_item_playstation2 title "プレイステーション2" comment {"人気の最新式DVDプレイヤー。 コレさえあれば 映画にアニメも 見ほうだい! ちなみに ゲームもできるというウワサが。"} itemname db_item_nintendowii title "Wii" comment {"人気の健康器具。 同梱のWiiリモコンは イザというときに 武器にもなるぞ。 ちなみに ゲームもできるらしい。"} itemname db_item_nintendods title "ニンテンドーDS" comment {"現在 ちまたで話題沸騰中の 最新式脳トレゲーム機。 さらに 別売のソフトを買えば 電子辞書や家計簿 さらにはTVチューナーなど ベンリなツールに 早変わり!"} default if type=db_title : return "エラー" if type=db_comment : return {"このメッセージが見れるのはおかしいよ。"} swend #global ;表示用処理 repeat redraw 0 color 63,63,127:boxf color 255,255,255 stick key if key&2 : sentaku-1 if key&8 : sentaku+1 pos 16,16 : mes sentaku pos 16,32 : mes database(db_title,sentaku) pos 16,52 : mes database(db_comment,sentaku) redraw 1 await 16 loop



この記事に返信する


沢渡

リンク

2021/6/2(Wed) 16:19:58|NO.92989

ソースを見た感じでは問題なさそうなのですが、色々試してみたところ、
itemnameマクロを#enumに置き換えるのが上手くいっていないのかもしれません。
(試しにdb_item_playstation2とdb_item_nintendowiiとdb_item_nintendodsを
mesで表示したところ、どれも0と表示された)

#defineについてヘルプで調べてみると
>現状ですべてのプリプロセッサがマクロ展開に対応しているわけではありません。
とありますが、どうもこのスレ↓を読んだ限り、
マクロ展開に対応しているプリプロセッサはかなり限定的であるようです。
(同スレの木村氏によると#deffuncと#defcfuncぐらいしか対応していない様子?)
http://hsp.tv/play/pforum.php?mode=pastwch&num=33137

個人的には「どのゲームハード名がどの数値に対応しているのか」を
一覧できた方がわかりやすいように思えるので、
このような形ではどうでしょうか。

;データベース実装テスト ;------------------ #module "db_test" ;マクロ定義 #enum global db_title = 0 #enum global db_comment #enum db_item_playstation2=0 #enum db_item_nintendowii #enum db_item_nintendods #undef title #define title(%1="未設定") if type=db_title : return %1 #define comment(%1="未設定") if type=db_comment : return %1 ;関数 #defcfunc database int type,int id switch id ;これらのデータは仮です case db_item_playstation2 title "プレイステーション2" comment {"人気の最新式DVDプレイヤー。 コレさえあれば 映画にアニメも 見ほうだい! ちなみに ゲームもできるというウワサが。"} case db_item_nintendowii title "Wii" comment {"人気の健康器具。 同梱のWiiリモコンは イザというときに 武器にもなるぞ。 ちなみに ゲームもできるらしい。"} case db_item_nintendods title "ニンテンドーDS" comment {"現在 ちまたで話題沸騰中の 最新式脳トレゲーム機。 さらに 別売のソフトを買えば 電子辞書や家計簿 さらにはTVチューナーなど ベンリなツールに 早変わり!"} default if type=db_title : return "エラー" if type=db_comment : return {"このメッセージが見れるのはおかしいよ。"} swend #global ;表示用処理 repeat redraw 0 color 63,63,127:boxf color 255,255,255 stick key if key&2 : sentaku-1 if key&8 : sentaku+1 pos 16,16 : mes sentaku pos 16,32 : mes database(db_title,sentaku) pos 16,52 : mes database(db_comment,sentaku) redraw 1 await 16 loop



初心者

リンク

2021/6/2(Wed) 18:30:02|NO.92990

>沢渡さん
ありがとうございます。
プログラムソースの最初でenumを定義するより、分岐のマクロ内で定義してしまうようにしたら
あとからデータを追加するときに手間が減って便利だと思っていたのですが、
見直さざるを得ないみたいですね・・・

それにしても、こういう仕様はちゃんとヘルプに書いておいてほしい・・・
いつもこういうところでつまづく・・・



初心者

リンク

2021/6/2(Wed) 18:31:18|NO.92991

すみません、解決のところチェックし忘れたので再書き込みです



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