Tíquete #31337

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

: 2013-05-11 20:31 Última Atualização: 2013-06-01 11:57

Relator:
(Anônimo)
Dono:
Tipo:
Estado:
Fechado
Componente:
Marcos:
(Nenhum)
Prioridade:
5 - Medium
Gravidade:
5 - Medium
Resolução:
Fixed
Arquivo:
Nenhum
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

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

Ticket History (3/16 Histories)

2013-05-11 20:31 Updated by: None
  • New Ticket "waitlnコマンドで空文字列を待つと、タイムアウトでなくてもresult=0になる" created
2013-05-12 20:36 Updated by: (del#24082)
Comentário

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

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

2013-05-13 19:23 Updated by: doda
Comentário

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

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

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

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

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

2013-05-14 00:45 Updated by: None
Comentário

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

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

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

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

2013-05-14 21:43 Updated by: (del#24082)
Comentário

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

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

2013-05-15 00:40 Updated by: None
Comentário

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

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

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

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

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

2013-05-15 21:54 Updated by: doda
Comentário

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 Updated by: doda
Comentário

None への返信

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

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

例えば

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

また逆に

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

2013-05-16 00:44 Updated by: None
Comentário

doda への返信

None への返信

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

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

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

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

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

2013-05-16 10:12 Updated by: doda
Comentário

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 Updated by: None
Comentário

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 Updated by: doda
  • Dono Update from (Nenhum) to doda
Comentário

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 Updated by: doda
Comentário

修正しました。

2013-06-01 09:01 Updated by: None
2013-06-01 11:57 Updated by: (del#1144)
  • Estado Update from Aberto to Fechado
  • Marco Update from Tera Term 4.78 (fechado) to (Nenhum)
  • Ticket Close date is changed to 2013-06-01 11:57
2013-06-19 00:44 Updated by: None
Comentário

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

Attachment File List

No attachments

Editar

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login