改題 switch−case文についてNo.00146
となりのニャンコ さん 98/12/19 22:03
 
145番のレスです。
            switch
            case "Hi!"
              wait "^M"              ;1行読み込むまで待つ
              readbuffer 0,#buffer
              if(part(#buffer,0,8) == "Hi!") ;誤信のための2重チェック
                ;ここに新しいハンドルを取得したときの処理を記述
              endif
            case ""    ;その他、自動挨拶など
              ・・・ 各処理を記述
            endswitch
大変貴重な意見をありがとうございました。

  実はですねえ、ニャンコは
  switch−case文が嫌いというわけでもないのですが、
使うたびに誤動作してしまって、どうも苦手なんですよ。
うちのパソコンが、 switch−case文との相性が悪いのか、
コマンドの使い方が間違っているのかわかりませんが

FEO(フェリシモオンライン)スクリプトに使った
switch−case文を載せておきます。

Returnkey:     ;********************** リターンキーを押して下さい のスクリ
プト
     send "^M"
Autoreturn:
     loopswitch
case "リターンキーを押して下さい"
      send "^M"
case "選択して下さい >"
      breakloop
endloop
      exit   ;eeeeeeeeeee Returnkey eeeeeeeeeリターンキーを押して下さい  ここまで
上のスクリプトを実行すると、動くときと、動かないときがあるんです。
なぜでしょうか。

これは動かなくても誰も困りませんが
一度、ログイン時のスクリプトに、同様のものを使ったことがあります。
FEOのログインは、「リターンキーを押して下さい」が通常は1回なのですが
たまに2回になることがあります。
 そこで、従来使っていたものを書き換えて、switch−case文を使ったものに
書き換えて配布しようと思ったことがあります。
 幸い、シスオペさんのところで、動作確認が間に合わずに配布されてはい
ませんでしたが、私一人でパニックを起こしていました。

通常使っているスクリプトは以下の通りです。
Return:
  wait "リターンキーを押して下さい"
      send "^M"
timeout 1
wait "選択して下さい >"
if( timeout ) goto Return
timeout 0
goto Soshin
exit       ;eeeeeeeeeee Autologin eeeeeeeeeeeeeログインスクリプト ここまで

[ ]
RE:00146 改題 switch−case文についてNo.00147
かずや さん 98/12/20 05:40
 
>使うたびに誤動作してしまって、どうも苦手なんですよ。
switch文は、wait文+if文を階層化したのと
同等の意味を持つものなので switch文が使えないのであれば
wait文+if文で試してみてはどうでしょうか?
ただし、サイズはでかくなります。

それで、wait文+if文でうまく動作すれば switch文に変換して
それで試してみて、誤動作するようなのであれば
switch文がバグってます(^-^;

例:
▼ switch文を使ったスクリプトが↓ならば・・・
loopswitch case
case "リターン"
  send "^M"
case "ループ"
  loopagain
case "ブレーク"
  breakloop
endloop

▼ wait文+if文は↓のようになる
timeout 30
beginloop
  wait "リターン","ループ","ブレーク"
  if(result == 1)
    send "^M"
  elseif(result == 2)
    loopagain
  elseif(result == 3)
    breakloop
  elseif(result == -1)  ;タイムアウト処理
    message "タイムアウト発生!"
  endif
endloop

以上。あえて else文のみの分岐は使っていませんが
サイズを考慮するなら、分岐の1つに else を使ってください。

>FEO(フェリシモオンライン)スクリプトに使った
>switch−case文を載せておきます。
FEOがどういう仕様なのか分かりませんが
loopswitch文の使い方は間違っていないようですね

今 得ている情報では、誤動作する原因が分かりません。
誤動作の種類だけでも教えていただけませんか?
・"リターンキーを押して下さい"を受信しているのに
 'send "^M"' が動作しない
・"選択して下さい >"を受信しているのに
 ループから抜けない
・その他・・・

途中に readbuffer文 や message文を挿入することで
デバッグすることもできるので、よければ試してください

>通常使っているスクリプトは以下の通りです。
>Return:
>  wait "リターンキーを押して下さい"
前述のスクリプトでは 'リターンキー'は全角ですが
このあたりに間違いはありませんか?

[ ]
RE:00147 改題 switch−case文についてNo.00148
となりのニャンコ さん 98/12/20 09:26
 
>            >FEO(フェリシモオンライン)スクリプトに使った
>            >switch−case文を載せておきます。
>            FEOがどういう仕様なのか分かりませんが
>            loopswitch文の使い方は間違っていないようですね
>
>            今 得ている情報では、誤動作する原因が分かりません。
>            誤動作の種類だけでも教えていただけませんか?
>            ・"リターンキーを押して下さい"を受信しているのに
>             'send "^M"' が動作しない
>            ・"選択して下さい >"を受信しているのに
>             ループから抜けない
>            ・その他・・・

"リターンキーを押して下さい"を受信しているのに
'send "^M"' が動作しない
 という症状です。動かないときは、何回やり直しても動きませんし、
 忘れた頃にやってみると「あれ、動いてる」という感じです。
hidetermのシステムかwindowsのシステムが疲れてくると、このような症状がでてく
るのではないかなと、疑っているのですが、
 ちなみにうちのパソコンのシステムは、長くても2ヶ月しか持ちません。短いとき
は半月で、再セットアップです。

 忘れた頃に動くというのも再セットアップした後だからかもしれません。
もしwindowsのシステムの痛みが原因だとしたら、配布するスクリプトには組み込ん
ではならないコマンドということになってしまいますが。

>            >通常使っているスクリプトは以下の通りです。
>            >Return:
>            > wait "リターンキーを押して下さい"
>            前述のスクリプトでは 'リターンキー'は全角ですが
>            このあたりに間違いはありませんか?

このあたりの間違いはありません。
  この会議室に投稿するのに「半角かな」は文字化けするかなと思って全部を全角
に書き換えたつもりだったのですが、一つだけ忘れたんですね。

[ ]
RE:00148 改題 switch−case文についてNo.00149
かずや さん 98/12/21 08:49
 
>"リターンキーを押して下さい"を受信しているのに
>'send "^M"' が動作しない
言葉が足りなかったようで 申し訳ありませんが
'確実に'リターンキーを押して下さいの文字列を
受信していることが確認できていますか?

(#00146から引用)
>通常使っているスクリプトは以下の通りです。
>Return:
>wait "リターンキーを押して下さい"
>send "^M"
>timeout 1
>wait "選択して下さい >"
>if( timeout ) goto Return
>timeout 0
>goto Soshin
>exit ;eeeeeeeeeee Autologin eeeeeeeeeeeeeログインスクリプト ここまで
通常使っていると言うことは、正常に動作していると
いうことでしょうか?

"選択して下さい >"が受信できていて、"リターンキーを押して下さい"が
受信できない、ということはないと思います

もし↑で正常に動作しているならば、wait文とsend文も正常に動作しているので
case文が正常に動作しないとは思えません

現段階で言えるのは、switch文の使い方に誤りがあったか
case文の受信文字列を間違っていたかです

FEOのログ(の一部)とスクリプトが手元にあれば
分かりやすいのですが・・・(^-^;

ちなみに、お使いの秀Termのヴァージョンはいくつですか?

まあ、無理に switch文を使おうとしなくてもいいんですけどね(^-^;
受信文字列を処理するコマンドは、他に getline や readbuffer が
ありますから・・・

[ ]
RE:00149 改題 switch−case文についてNo.00150
となりのニャンコ さん 98/12/21 10:30
 
すみません。
以前のものをよく確認してみましたところ
Returnkey:というタイトルが2つあって誤動作していたのかもしれません。
ご迷惑おかけしました。

[ ]
RE:00150 改題 switch−case文についてNo.00151
かずや さん 98/12/21 18:01
 
>以前のものをよく確認してみましたところ
>Returnkey:というタイトルが2つあって誤動作していたのかもしれません。
よかっですね(*^-^*)

こういう間違いって、よくあることですよ(笑)
倫理エラーはリストアップしてくれませんからね・・・(^-^;
σ(^-^)なんか、いくらバグ取りは完璧にしたっ!!と思っていても
次のヴァージョンまでに、必ず1つはバグ発見してしまいますよ(笑)

[ ]