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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1016
=9_9=条件分岐先での#defineについて。14解決


=9_9=

リンク

2009/10/16(Fri) 17:44:59|NO.28314

例えば、以下のように、条件によってhogeを変えたいと思っています。


a=1 if a=1{ #define hoge mes }else{ #define hoge dialog } hoge "test"

しかし、(当たり前ですが)エラーが出てしまいます。
どのようにすればよいのか、何方かご教授お願いします。



この記事に返信する


チェ

リンク

2009/10/16(Fri) 18:10:15|NO.28317


#module hogeModule #define global hogeFlag flag@hogeModule #deffunc hoge str P if hogeFlag == 0 : mes P if hogeFlag == 1 : dialog P return #global hogeFlag = 0 hoge "この星を消す!!" hogeFlag = 1 hoge "そうはいくか!界王拳20べぇだぁああ!!!"

defineにこだわることはないかと思います。



=9_9=

リンク

2009/10/16(Fri) 18:53:21|NO.28318

回答ありがとうございます。

しかし、命令の方はチェ様の方法でクリアできたのですが、
以下の場合はどのようにすればよいのでしょうか。
(之もまた#defineに拘ったソースで申し訳ないです...)

a=1 if a=1{ #define hoge "apple" }else{ #define hoge "orange" } mes hoge



check

リンク

2009/10/16(Fri) 19:45:01|NO.28321

#defineはプリプロセッサだから、ほか命令より先に実行される。

#define TEST 10
mes "TEST = " + TEST
は、
mes "TEST = " + 10
のように変換されてから実行される。



窓口

リンク

2009/10/16(Fri) 22:08:54|NO.28327

>>チェさんに便乗して

#module #define global hogeflg hogeflg_@ #defcfunc hogehoge if hogeflg = 1 { return "apple" }else{ return "orange" } #define global hoge hogehoge() #global hogeflg = 1 mes hoge
とりあえず普通に配列変数に代入したほうが高速で手間無しだと思います。
それでも大丈夫ならこんな方法もあります。


#define hoge hogehoge(flg) hogehoge = "orange","apple","hogehoge" flg = 0 mes hoge



窓口

リンク

2009/10/16(Fri) 22:25:47|NO.28328

ついでに投稿。

#define hoge(%1) if flg = 0 { mes %1 }else{ dialog %1 } hoge "text"



shinkun

リンク

2009/10/17(Sat) 16:23:22|NO.28338

これまでの回答は全て、プログラムの実行中に分岐して解決する例でしたので、私はプリプロセス中に分岐してマクロの定義を選択させる事で解決する例を提示しますね。

#define HOGE_IS_MES ; マクロ HOGE_IS_MES を定義すれば hoge は mes に、 ; コメントアウトして定義しなければ hoge は dialog に定義される。 #ifdef HOGE_IS_MES #define hoge mes #else #define hoge dialog #endif hoge "OK" stop
この方法では、コンパイル時に hoge が mes か dialog に固定されてしまうため、他の皆さんが提示されたようにプログラムの実行中に hoge の処理内容を切り替える事は出来ませんが、その必要が無いのでしたら毎回の hoge の実行に if 命令による分岐処理が無くて済む分コチラの方法がより適しているかもしれません。
また、=9_9= さんの 2 つ目の質問も同様に解決する事が出来ます。

プリプロセッサ命令について詳しく知りたい場合は、コチラを参考にすると勉強になるかと思います。
http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2F%A5%D7%A5%EA%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5



=9_9=

リンク

2009/10/18(Sun) 12:03:22|NO.28370

皆さん、ご回答ありがとうございます。
窓口様の方法(NO.28328)で、試してみたのですが、DLLから呼び出した命令だと、
「#Error:too many macro parameter」と怒られてしまいました。
因みに、int,str,intです。



窓口

リンク

2009/10/18(Sun) 17:06:06|NO.28382

>>=9_9=さん

どの様な状況でそうなったのかが解らないので何とも言えません。
出来ればスクリプトをお願いします。



f(飲酒中)

リンク

2009/10/18(Sun) 17:25:58|NO.28385

言って良い?

・・・。


根本的に、#defineの使い方が間違ってんじゃね?
出来る出来ないの話じゃなくて、「そんな書き方するな」と言うべきじゃね?


まあ、人それぞれとは思うが・・・。



窓口

リンク

2009/10/18(Sun) 18:58:55|NO.28389

>>f(飲酒中)さん

すみません。
そう思います。



=9_9=

リンク

2009/10/18(Sun) 21:53:11|NO.28397

窓口様、f(飲酒中)様、回答ありがとうございます。
私、アーカイバを操作するプログラムを作っておりまして、
統合アーカイバのDLLは大体似たような命令ですので、
(例:hogehogeOpenArchive、hogehogeCloseArchive等)
hogehogeの部分を条件分岐で変化させて、
まとめる事が出来ればと考えた次第です。
やはり扱う書庫が多くなるとその分肥大化しますので...

もし、define以外での良い方法があれば、教えていただければ幸いです。



check

リンク

2009/10/18(Sun) 21:57:59|NO.28398

ふつうに一つ一つ書いていくのが無難じゃないか?



窓口

リンク

2009/10/19(Mon) 07:11:58|NO.28406

よくわかりませんが。
どうしても一つにまとめたいのなら、フラグではなく引数に渡したほうが
効率的だと思います。


#module #deffunc hogehogeOpenArchive str OA_st1 , str OA_st2 mes strf("hogehogeOpenArchive %s,%s 実行",OA_st1,OA_st2) return #deffunc hogehogeCloseArchive str CA_st1 , str CA_st2 mes strf("hogehogeCloseArchive %s,%s 実行",CA_st1,CA_st2) return #define global hogeArchive(%1=0,%2="引数2",%3="引数3") if (%1=0) { hogehogeOpenArchive %2,%3 }else{ hogehogeCloseArchive %2,%3} #global repeat 10 mes "第一引数" + str(cnt\2) hogeArchive cnt\2 loop

とはいっても、これは展開された時に、


#module #deffunc hogehogeOpenArchive str OA_st1 , str OA_st2 mes strf("hogehogeOpenArchive %s,%s 実行",OA_st1,OA_st2) return #deffunc hogehogeCloseArchive str CA_st1 , str CA_st2 mes strf("hogehogeCloseArchive %s,%s 実行",CA_st1,CA_st2) return #global repeat 10 mes "第一引数" + str(cnt\2) if (cnt\2=0) { hogehogeOpenArchive "引数2","引数3" }else{ hogehogeCloseArchive "引数2","引数3" } loop
と全く同じに意味になりますので一つのスクリプトの中で何度も同じスクリプトを使用する
必要がない限り、時間の無駄の様な気がします。



=9_9=

リンク

2009/10/19(Mon) 16:37:39|NO.28425

皆さん回答ありがとうございました。

UnZipOpenArchive→〜→UnZipFindFirst→〜〜〜→UnzipCloseArchive
UnlhaOpenArchive→〜→UnlhaFindFirst→〜〜〜→UnlhaCloseArchive
等と言った似たような処理を何度も書庫ごとに繰り返すため、
何とかまとめる事が出来ればと思っていたのですが、
その考えが甘かったようです。
違う方向で考えていきたいと思います。



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