チケット #31337

waitlnコマンドで空文字列を待つと、タイムアウトでなくてもresult=0になる

登録: 2013-05-11 20:31 最終更新: 2013-06-01 11:57

報告者:
(匿名)
担当者:
チケットの種類:
状況:
完了
コンポーネント:
マイルストーン:
(未割り当て)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし
投票
点数: 0
No votes
0.0% (0/0)
0.0% (0/0)

詳細

waitlnコマンドで空文字列を待つと、タイムアウトでなくてもresult=0になる。

チケットの履歴 (16 件中 3 件表示)

2013-05-11 20:31 更新者: None
  • 新しいチケット "waitlnコマンドで空文字列を待つと、タイムアウトでなくてもresult=0になる" が作成されました
2013-05-12 20:36 更新者: (del#24082)
コメント

空文字を指定した場合、何も行われずに、コマンドが終了します。 resultに対しても何も操作しないので、以前の値が残ったままとなります。

こちらで試した限りだと、resultの値は0というわけではなく、まちまちになりました。

2013-05-13 19:23 更新者: doda
コメント

確認ですが、空文字列を待つのはどのような時に使ってどのような結果になるのを期待していますか?

こちらで試した限りだと、resultの値は0というわけではなく、まちまちになりました。

書かれているように、空文字列のみを指定した場合はresultの値をいじらないので、 最後にresultをセットするコマンドが残した値がそのまま見えるだけですよね。

# 他にresultをセットするコマンドを使っていない場合は初期値の0になる

wait(ln)に空文字列のみを指定した時は実質エラー扱いなので、result に -1 辺りをセットするようにした方がいいかもしれません。

2013-05-14 00:45 更新者: None
コメント

ご確認ありがとうございます。エラー扱いとのこと了解しました。

空文字列を waitln で待つ場合は、recvln と同じように改行まで待つ動作を期待していました。

テキストファイルを一行ずつ読み込み、読み込んだものを waitln で待つように使っていました。 空行があると同期できなくなってしまっていたので投稿させていただきました。

実装内容がわかりましたので、マクロを組み直してみます。

2013-05-14 21:43 更新者: (del#24082)
コメント

wait → Syntax errorにする waitln → 改行のみ待つようにする

というふうにするのが自然でしょうか?

2013-05-15 00:40 更新者: None
コメント

どのような実装が適切であるかははっきりとは申し上げられませんが、利用者の立場から言わせていただくと、

wait、waitlnコマンドは何かしらの入力を待ちたいときに使用しますので、Syntax errorで待ちが発生せず処理が進むより、

wait (空文字列) なら、何かしらの入力があるまで待つ、

waitln (空文字列) なら、改行があるまで待つ、

としていただけると使いやすいかと思います。

2013-05-15 21:54 更新者: doda
コメント

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周目だけがエラーになるのが非常に分かりづらいです。

2013-05-15 22:04 更新者: doda
コメント

None への返信

wait (空文字列) なら、何かしらの入力があるまで待つ、
waitln (空文字列) なら、改行があるまで待つ、

動作的にはこれが無難ですかね。あと、複数の文字列でwaitした時にどの順番でマッチすべきかという問題もあります。

例えば

wait "" "a"
とした時に a が来た場合、result は 1 でしょうか、それとも 2 でしょうか。

また逆に

wait "a" ""
の時はどちらになるべきでしょうか。

2013-05-16 00:44 更新者: None
コメント

doda への返信

None への返信

wait (空文字列) なら、何かしらの入力があるまで待つ、
waitln (空文字列) なら、改行があるまで待つ、

動作的にはこれが無難ですかね。あと、複数の文字列でwaitした時にどの順番でマッチすべきかという問題もあります。 例えば

> wait "" "a"
とした時に a が来た場合、result は 1 でしょうか、それとも 2 でしょうか。 また逆に
> wait "a" ""
の時はどちらになるべきでしょうか。

どちらも result=1 になることを期待します。

引数を前から順に比較していき、条件に合うものがあったら以降は無視するというような処理がわかりやすいと思います。

2013-05-16 10:12 更新者: doda
コメント

None への返信

wait "a" ""
の時はどちらになるべきでしょうか。

どちらも result=1 になることを期待します。
引数を前から順に比較していき、条件に合うものがあったら以降は無視するというような処理がわかりやすいと思います。

「引数を前から比較して最初に合うもの」だと

wait "test" "es"
で "test" が来た時の動作と合わないんですよね。この場合は 's' が来た時点で "es" の方が確定するので、result が 2 になります。
wait "a" ""
の場合も、最初に文字 'a' が来た時点で確定する "a" よりも、wait コマンド実行時に確定する "" になるべきじゃないかという考え方もあると思います。

# この考え方に従うと、wait "" は即座に終了して result に 1 を返すべきのような気もしてきた。

2013-05-20 23:14 更新者: None
コメント

doda への返信

「引数を前から比較して最初に合うもの」だと

> wait "test" "es"
で "test" が来た時の動作と合わないんですよね。この場合は 's' が来た時点で "es" の方が確定するので、result が 2 になります。

result=2になると思っていましたで違うのでしょうか。そうでなければ、"es"の後にもう一文字が来るまで"es"も確定しないことになります。 そのもう一文字のためにタイムアウトが発生しないとも限りません。

> wait "a" ""
の場合も、最初に文字 'a' が来た時点で確定する "a" よりも、wait コマンド実行時に確定する "" になるべきじゃないかという考え方もあると思います。 # この考え方に従うと、wait "" は即座に終了して result に 1 を返すべきのような気もしてきた。

wait "" で即座に返るようにするなら、正常動作とするべきでは内容に思います。wait文の役目とする「待機」を行わないからです。

2013-05-22 10:47 更新者: doda
  • 担当者(未割り当て) から doda に更新されました
コメント

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 が条件を満たさなくなります。

まあ、現状の動作はよくなく、こだわりすぎて結局変わらないというのは避けたいので、とりあえず

  • wait "" では何か一文字受信するのを待つ
  • wait "a" "" で "a" がきた場合は result=1 にする

という動作にしましょうか。 実装的にもこれが一番楽ですし。

2013-05-24 10:00 更新者: doda
  • マイルストーン(未割り当て) から Tera Term 4.78 (完了済み) に更新されました
  • 解決法なし から 修正済み に更新されました
コメント

修正しました。

2013-06-01 09:01 更新者: None
2013-06-01 11:57 更新者: (del#1144)
  • 状況オープン から 完了 に更新されました
  • マイルストーンTera Term 4.78 (完了済み) から (未割り当て) に更新されました
  • チケット完了時刻2013-06-01 11:57 に更新されました
2013-06-19 00:44 更新者: None
コメント

修正ありがとうございました。 期待通りの動作になっています。

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする