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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0322
たこifの論理和8解決


たこ

リンク

2009/3/22(Sun) 11:40:07|NO.24043

C言語では

int Test(void){ printf("COME IN\n"); return TRUE; } int main(void) { int a = 1; if(a || Test){ printf("HERE\n"); }
を実行すると「HARE」とだけ表示されます

HSPでこれと同じことをやろうとすると

#module #defcfunc TEST mes "COME IN" return 1 #global a = 0 judge = 0 if a { judge = 1 }else: if TEST(){ judge = 1 } if judge { mes "HERE" }
と、書かなければなりません

つまりHSPで、
論理和で1つ目が正しければ後ろの比較はしない
というプログラムを簡単に書きたいのですが、
何かいい方法はありませんか?



この記事に返信する


たこ

リンク

2009/3/22(Sun) 11:44:54|NO.24045

すみません、何箇所かミスがありました
× if(a || Test){
○ if(a || Test()){

× を実行すると「HARE」とだけ表示されます
○ を実行すると「HERE」とだけ表示されます



SYAM

リンク

2009/3/22(Sun) 11:57:26|NO.24046

とりあえずこっちのほうが多少、見やすいとは思います。

if a:goto *TRUE if TEST():goto *TRUE goto *FALSE *TRUE mes "HERE" *FALSE



たこ

リンク

2009/3/23(Mon) 15:11:18|NO.24065

SYAMさん回答ありがとうございます

goto文だと、複数つける時を考えると
かなり複雑になってしまいます

でも、そういうやり方もあるということで、勉強になりました



shinkun

リンク

2009/3/23(Mon) 15:25:03|NO.24068

短絡評価するマクロを作ってみてはどうでしょうか?
マクロの定義がイヤらしいですが…。


; 短絡評価をする or マクロ (short-circuit evaluation or) #define ctype s_or(%1,%2) %ts_or (%1): goto *%i: else: if (%2): *%o ; ---- ; 以下、テスト用プログラム #module #defcfunc test int n mes "test" ; 関数を評価しているか確認するための出力 return n ; 引数をそのまま返すだけ #global a = 1 ; どちらか一方でも 非0 なら b = 0 ; 以下の条件は真になる if s_or(a,test(b)) { mes "OK!!" }

これを使えば、とりあえず 2 つの条件における短絡評価は出来ます。
が、構文の裏をかいたようなマクロ定義のため、次のような C 言語風の記述は出来ません。


if (s_or(a,b)) { ; エラー!! 展開されたマクロは文法上不正!! mes "OK!!" }

う〜ん、微妙。
とりあえず、s_or ってマクロ名は動作内容が分かりにくいので、
良い名前に改名したい所ですね。



SYAM

リンク

2009/3/23(Mon) 15:34:26|NO.24069

ではもう少し改良したものを.
以下の2つの文をよく読んでください。

「A または B のとき、 C である」
「Aではなく、かつ、Bではない とき、 C ではない」

…同じ意味になるということが分かりましたか?
このように、同じ意味の条件を OR ではなく AND で表現できます。
ということは、if 構文をネストすることで内側の条件を評価しないようにできますね。
HSPには not演算子が見当たらないので、 (a==0) を 「 a ではない」とします。

スクリプトにしてみると、


if( a == 0 ){ if(TEST() == 0){ goto *@f } } mes "HERE" *@

こうなります。
goto のジャンプ先が1つなので、ローカルラベルが利用できますね。
スクリプト中にこのような構造が何箇所かできてもラベル名が色々できちゃったりしません。



たこ

リンク

2009/3/23(Mon) 15:41:53|NO.24070

二つも回答ありがとうございます

でも、実は、自分が納得する回答ではありません
(ほんと、ごめんなさいm(_ _)m)

正直、goto文自体をあまり使いたくないのですが、
その条件では最初のプログラム以外では表現不可能なのでしょうか?



shinkun

リンク

2009/3/23(Mon) 16:24:44|NO.24071

質問の意味が良く理解出来なかったのですが、単純に、goto は使いたくない
ってだけなら、SYAM さんの書かれたスクリプトは「ほぼ」答えになっていると思います。



たこ

リンク

2009/3/23(Mon) 16:43:45|NO.24073

すいません、スクリプトをよく見てませんでした

SYAMさんのプログラムが回答でした
回答ありがとうございました



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