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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0816
猫太else : ifの文法バグらしきもの2解決


猫太

リンク

2006/8/16(Wed) 10:38:24|NO.2008

最近else : if を使ってて気づいたんですが、
下記のようなスクリプトを実行するとelseに対応するifが発見できないと文句をいわれます。

repeat 3 if( cnt == 1 ){ dialog } //ここになにかあるとelseが認識されない。コメントもダメ。 else : if cnt == 2{ dialog "else if の文法バグ" } loop
皆さんは個の現象を確認出来ますか?
できたらバグトラックに報告しようと思います。

環境
Win XP Home SP2
HSP 3.1b5



この記事に返信する


kz3

リンク

2006/8/16(Wed) 11:42:43|NO.2010

それは『else: if』が問題ではなく、『if〜else』は間に行を挟んではいけない、
という仕様という見方が多いようです。

# HSP掲示板で既出
# HSPでは改行が重要な意味を持つとか...

で、「行を挟むといってもコメントはコンパイル時には取り除かれるんでしょ?」と返されそうですが、
プリプロセッサのコメント除去が『行を詰めない』仕様のため、コメント行は空行になります。

# ためしに『#cmpopt ppout 1』を冒頭に書いてコンパイル => .iファイルを開いて確認。

この空行が if と else を切り離しているので、「単独でelseは使えないよ」と警告しているんだと思います。

バグトラックに出すとすれば、要望として「プリプロセッサのコメント除去の方法を変えてほしい」とか、だと思いますが、
私は次のようなスタイルでブロック内( {...} )にコメントを書きます。
/* 外側のコメントはif-else全体の処理の説明 */
// 「○○はどうか?」や「□□を調べる」など if( 1 ){ /* 真のブロック内のコメントは真の処理の説明 */ // 「○○をする」など } else{ /* 偽のブロック内のコメントは偽の処理の説明 */ // 「□□をやめる」など }

それより私は「else: if」は動作が怪しかったような記憶が...( たくさんネストしたときとか )
勘違いかも知れません。同じように書いている人もいたので...。



Irisawa

リンク

2006/8/16(Wed) 12:03:39|NO.2011

そもそも、HSPの文法上、C等とは違い改行の意味が大きいのでifの行かifの閉じブレースの
行以外の行にelseを入れるのは認められていなかったと思います。
(公式的にそういう発表などがされているかどうかは不明ですが動いてしまうのは
誤作動に近いものみたいです)
そのため、そのような書き方はやめたほうがいいでしょう。



if xxx : xxxx : else : xxxxx


if xxx { xxxx } else { xxxxx }
×

; エラー if xxx : xxxx else : xxxxx
×

; エラー ; この場合、最後の閉じブレース(})を省略すると動作する ; 後述の例を合わせて考えると「xxxx : else」のようにすると ; 「:」がifの閉じブレースのブレース代わりになる模様 if xxx { xxxx : else : xxxxx }


; 閉じブレース(})の行にelseがない if xxx { xxxx } else { xxxxx }


; 同一if文内でのマルチステートメントとブレースの併用1 ; HSP2.xxでは(動作が保証されていないため)非推奨とされた文法 ; (HSP3.xxでは改善されているとのこと) if xxx : xxxx : else { xxxxx }


; 同一if文内でのマルチステートメントとブレースの併用2 ; HSP2.xxでは(動作が保証されていないため)非推奨とされた文法 ; (HSP3.xxでは改善されているとのこと) if xxx { xxxx : else { xxxxx }


; 同一if文内でのマルチステートメントとブレースの併用3 ; HSP2.xxでは(動作が保証されていないため)非推奨とされた文法 ; (HSP3.xxでは改善されているとのこと) if xxx { xxxx } else : if { xxxxx }



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