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


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0809
sdHSP3.6 if分岐での:と{}併用について バグか仕様か8解決


sd

リンク

2025/8/9(Sat) 09:21:03|NO.103807

ifの分岐を:でした行において{}での分岐を記述した場合に1つ目のifが意図せず終了してしまいますが、これは仕様でしょうか。

この記述方法でdialogが実行されてしまします。

if 0 :if 1 { } dialog

このスクリプトにおいて、大括弧{}はニ番目のifの範囲を指定するものと意図していますが、
}の時点で一番目のifの終了と認識されてしまい、続くスクリプトが実行されてしまうようです。



この記事に返信する


さか

リンク

2025/8/9(Sat) 10:40:33|NO.103808

以下でも同じ動きしますね。
if 0 { }dialog
dialogは以下のように単純に次の命令として実行されているのかと思います。
if 0 :if 1 { }:dialog



さか

リンク

2025/8/9(Sat) 17:32:47|NO.103812

ちょっと違うますね。
やっぱりおっしゃってるように、最初のif 0なのにdialogが実行されるのはおかしいですね。



窓月らら

リンク

2025/8/9(Sat) 18:14:53|NO.103813

レスしようか考えちゃったのですが・・これは仕様だと思われます。
まず以下のような記述ができます。

a=1: if a { dialog "a=1" }: dialog "!"

つまり } でifは閉じたとみなされます。
その後にマルチステートメントで更に記述することもできるので

if 0 :if 1 { } dialog

これですと、まず最初の0が不成立でif 1 {} もスルーされますから、
マルチステートメントと見なされて dialog が実行されるという流れです。
いずれにしてもこの書き方はあまりよくないですし、やらないと思うのですがね…
私はマルチステートメントと区別するために if n { } のほうで統一しています。



G

リンク

2025/8/9(Sat) 18:55:28|NO.103815

HSPのifには{}を使わず行末まで対象なものと{}を使いその間が対象になるものと2種類あります
sdさんの言いたいことは最初のifは行末まで対象のものなので同じ行のdialogが実行されるのはおかしいということですよね。
ですがこの2種類のifを混ぜたとき、以下のような書き方もできるのでこれは仕様ということでいいと思います。

if 0 :if 1 { }



sd

リンク

2025/8/9(Sat) 23:02:28|NO.103816

>最初のif 0なのにdialogが実行されるのはおかしい
>最初のifは行末まで対象のものなので同じ行のdialogが実行されるのはおかしいということ
まさにそのとおりです。

>窓月らら さんの言うように{}で統一すれば解決します。見た目的にも時流的にも良いのでしょう。

:の仕様としては行内なのにおかしいと思いますが、マニュアルでも{}の説明として"複数行で"と書かれているので、行内{}についてはあまり想定されていないのでしょう。
仕様なのかもと思いつつ、一応報告とさせてもらいました。

if分岐の:にelseは使えますが、分岐を終了する命令がないので{}で無理やり記述しようとしていたんですよね。
分岐終了の命令があればいいのにとも思いますが、そもそも一行で複雑になりすぎるのも良くないかもしれませんね。

行内に混在させるのは当然良くないのでしょうが、
#define内で分岐を詰め込んでしまおうとしたときに不都合が起きました。
マクロではなく関数/命令を定義してもおそらく解決するのでしょう。

試していませんが、もしかすると{}を使っている標準マクロでも同じようなことが起きるかもしれませんね。

配列変数の範囲外参照の防止のためにandではなく別命令で
if 範囲内 :if 配列参照{
}
のような書き方を良くしていたので、勝手に行内でも使えるだろうと勘違いしてしまったところです。



sd

リンク

2025/8/9(Sat) 23:42:52|NO.103818

if 0	:a=3	:while a<5	:a=a+1	:mes "A="+a	:wend

試してみましたが、while以降が実行されます。



名無し

リンク

2025/8/10(Sun) 05:41:11|NO.103819

報告の通り、処理の終端がないHSP3としては気になるところですよね。

C言語系のif文1行記法では終端「;」までの1処理しかできません。
HSP3は処理ごとに終端がないので「:」にて複数処理を追加できます。

ただし「{}」が記述された場合に処理の切り替わりや終端扱いなのは
1行処理の限界であり、C言語系の記法に準じているだけかと考えます。

>試してみましたが、while以降が実行されます。

while-wendは命令ではなくhspdef.asのプログラム制御マクロです。
展開をするとラベルとif{}が挿入されているので処理の切り替わりや
複数処理の終端扱いとなります。
想定ですが、if 0は処理しませんが*_while_0000に戻り処理されます。

if 0 :a=3 :while a<5 :a=a+1 :mes "A="+a :wend

↓↓↓

##0 "hspdef.as"
if@hsp 0 :a=3 :*_while_0000:if@hsp ( a<5)=0 { goto@hsp *_break_0000} :
a=a+1 :mes@hsp "A="+a :*_continue_0000: goto@hsp *_while_0000:
*_break_0000



sd

リンク

2025/8/10(Sun) 09:40:34|NO.103820

>処理の切り替わりや終端扱いなのは1行処理の限界
行き着くところはこういうことなのかもしれませんね。

一様な処理をするコンピュータの言語系としては同じ処理に対して複数の記述ができるという事自体理想的ではないのでしょうが、人間の私としては現に:を便利に併用していますのでありがたいことです。
後方互換の.(ドット)配列記述もまた同じことなのでしょう。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.103807への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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