waitlnコマンドで空文字列を待つと、タイムアウトでなくてもresult=0になる
空文字を指定した場合、何も行われずに、コマンドが終了します。 resultに対しても何も操作しないので、以前の値が残ったままとなります。
こちらで試した限りだと、resultの値は0というわけではなく、まちまちになりました。
確認ですが、空文字列を待つのはどのような時に使ってどのような結果になるのを期待していますか?
こちらで試した限りだと、resultの値は0というわけではなく、まちまちになりました。
書かれているように、空文字列のみを指定した場合はresultの値をいじらないので、 最後にresultをセットするコマンドが残した値がそのまま見えるだけですよね。
# 他にresultをセットするコマンドを使っていない場合は初期値の0になる
wait(ln)に空文字列のみを指定した時は実質エラー扱いなので、result に -1 辺りをセットするようにした方がいいかもしれません。
ご確認ありがとうございます。エラー扱いとのこと了解しました。
空文字列を waitln で待つ場合は、recvln と同じように改行まで待つ動作を期待していました。
テキストファイルを一行ずつ読み込み、読み込んだものを waitln で待つように使っていました。 空行があると同期できなくなってしまっていたので投稿させていただきました。
実装内容がわかりましたので、マクロを組み直してみます。
wait → Syntax errorにする waitln → 改行のみ待つようにする
というふうにするのが自然でしょうか?
どのような実装が適切であるかははっきりとは申し上げられませんが、利用者の立場から言わせていただくと、
wait、waitlnコマンドは何かしらの入力を待ちたいときに使用しますので、Syntax errorで待ちが発生せず処理が進むより、
wait (空文字列) なら、何かしらの入力があるまで待つ、
waitln (空文字列) なら、改行があるまで待つ、
としていただけると使いやすいかと思います。
yutakapon への返信
wait → Syntax errorにする waitln → 改行のみ待つようにする
waitとwaitlnで動作が違うのは混乱の元でしょう。
あと、Syntax errorにした場合、
strdim waitstr 3 waitstr[0] = "test" waitstr[1] = "test2" waitstr[2] = "" for i 0 2 wait waitstr[i] messagebox result waitstr[i] nextというようなマクロでループの3周目だけがエラーになるのが非常に分かりづらいです。
None への返信
wait (空文字列) なら、何かしらの入力があるまで待つ、
waitln (空文字列) なら、改行があるまで待つ、
動作的にはこれが無難ですかね。あと、複数の文字列でwaitした時にどの順番でマッチすべきかという問題もあります。
例えば
wait "" "a"とした時に a が来た場合、result は 1 でしょうか、それとも 2 でしょうか。
また逆に
wait "a" ""の時はどちらになるべきでしょうか。
doda への返信
None への返信
wait (空文字列) なら、何かしらの入力があるまで待つ、
waitln (空文字列) なら、改行があるまで待つ、動作的にはこれが無難ですかね。あと、複数の文字列でwaitした時にどの順番でマッチすべきかという問題もあります。 例えば
> wait "" "a"とした時に a が来た場合、result は 1 でしょうか、それとも 2 でしょうか。 また逆に> wait "a" ""の時はどちらになるべきでしょうか。
どちらも result=1 になることを期待します。
引数を前から順に比較していき、条件に合うものがあったら以降は無視するというような処理がわかりやすいと思います。
None への返信
wait "a" ""の時はどちらになるべきでしょうか。どちらも result=1 になることを期待します。
引数を前から順に比較していき、条件に合うものがあったら以降は無視するというような処理がわかりやすいと思います。
「引数を前から比較して最初に合うもの」だと
wait "test" "es"で "test" が来た時の動作と合わないんですよね。この場合は 's' が来た時点で "es" の方が確定するので、result が 2 になります。
wait "a" ""の場合も、最初に文字 'a' が来た時点で確定する "a" よりも、wait コマンド実行時に確定する "" になるべきじゃないかという考え方もあると思います。
# この考え方に従うと、wait "" は即座に終了して result に 1 を返すべきのような気もしてきた。
doda への返信
「引数を前から比較して最初に合うもの」だと
> wait "test" "es"で "test" が来た時の動作と合わないんですよね。この場合は 's' が来た時点で "es" の方が確定するので、result が 2 になります。
result=2になると思っていましたで違うのでしょうか。そうでなければ、"es"の後にもう一文字が来るまで"es"も確定しないことになります。 そのもう一文字のためにタイムアウトが発生しないとも限りません。
> wait "a" ""の場合も、最初に文字 'a' が来た時点で確定する "a" よりも、wait コマンド実行時に確定する "" になるべきじゃないかという考え方もあると思います。 # この考え方に従うと、wait "" は即座に終了して result に 1 を返すべきのような気もしてきた。
wait "" で即座に返るようにするなら、正常動作とするべきでは内容に思います。wait文の役目とする「待機」を行わないからです。
None への返信
で "test" が来た時の動作と合わないんですよね。この場合は 's' が来た時点で "es" の方が確定するので、result が 2 になります。
result=2になると思っていましたで違うのでしょうか。そうでなければ、"es"の後にもう一文字が来るまで"es"も確定しないことになります。
はい、result=2 になります。これは "es" の方が先に(受信文字数が少ない段階で)条件を満たす為ですが、 同じように "a" と "" を考えた場合、受信文字数が 0 の時点で条件を満たす "" の方になるという考え方も有るかなと思いまして。
# この考え方に従うと、wait "" は即座に終了して result に 1 を返すべきのような気もしてきた。
wait "" で即座に返るようにするなら、正常動作とするべきでは内容に思います。wait文の役目とする「待機」を行わないからです。
結局は"空文字列を待つ"というのにどのような意味を与えるかという事になるのですが、 wait は受信バッファに指定した文字列が入るのを待つわけですが、受信バッファが空の状態でも空文字列は入っていると考える事もできますよね。
あと、wait "" で何か一文字受信するのを待つようにした場合、一文字の読み飛ばしが発生しますよね。 例えば、
wait "TE" wait "" wait "ST"としている時に "TEST" を受信した場合、"S" が wait "" で読み飛ばされるので三行目の wait が条件を満たさなくなります。
まあ、現状の動作はよくなく、こだわりすぎて結局変わらないというのは避けたいので、とりあえず
という動作にしましょうか。 実装的にもこれが一番楽ですし。
修正しました。
修正ありがとうございました。 期待通りの動作になっています。
waitlnコマンドで空文字列を待つと、タイムアウトでなくてもresult=0になる。