ループを抜けるには?

解決


マグ  2004-07-09 19:57:49  No: 114696  IP: [192.*.*.*]

簡単な質問なんですけど・・・

For i As Integer = 0 To i + 1
            〜〜〜〜
        Next

のように
もし、無限ループになったら抜ける方法はどうすればいいでしょうか?

編集 削除
旅人  2004-07-09 20:44:14  No: 114697  IP: [192.*.*.*]

私の場合は

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
For i As Integer = 0 To i + 1

'<<<<< 追加部分 >>>>>
If i >= 1000 Then Exit For
'<<<<<<<<<<>>>>>>>>>>

Next
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
と単純な方法でやります(^^;

上記例はループ数が1000に達した場合は
無限ループしていると判断してFor文から抜けるようにしています。

編集 削除
DAN  2004-07-09 21:17:59  No: 114698  IP: [192.*.*.*]

>For i As Integer = 0 To i + 1
VB4,5,6しか使った事ないけど、
この書き方ってありなんですか?
FOR文の中にどんなコードを記述しているかわかりませんが、
iが1になったらすぐ抜けるような気がするので、
無限ループにはならないんじゃないでしょうか?

編集 削除
Max  2004-07-09 21:56:46  No: 114699  IP: [192.*.*.*]

恐らくですが。。
例は別として(たぶん上記例では無限ループにならないです)

Do While 1
 --- 処理 ---
Loop

デバッグモードで実行中、上記のような無限ループに陥ったときに
プログラムを止めたいということをいいたいんじゃないでしょうか?

VB6ならCtrl+Breakで止まりますがVB.Netではどうなんでしょう?

編集 削除
マグ  2004-07-10 12:30:04  No: 114700  IP: [192.*.*.*]

Maxさんの言うとおり
無限ループになってしまった場合のとめる方法です。
ショートカットキーではなく、
プログラムでとめたいのです。
たとえば、ある処理が完全に終わるまで待つというプログラムを作る場合
プログラムはどんどん先に進んでいってしまいますよね。
それを先に進まないように無限ループでぐるぐる回して、
if文でそれが、完了したかを確認させて、完了したら、
無限ループを抜けるというような仕掛けを作るときに必要になってきてしまいます。
まだ、一度も、試してはいませんが・・・

私的には無限ループになりそうな気がしますけど、
確かにそう思えますけど・・・
まず、最初に初期値として、iに0が入ります。
そして、抜ける条件として、1の場合ということになります。
次に、iが1になったときには、抜ける条件が2ということになります。

編集 削除
DAN  2004-07-10 12:57:15  No: 114701  IP: [192.*.*.*]

>まず、最初に初期値として、iに0が入ります。
>そして、抜ける条件として、1の場合ということになります。
>次に、iが1になったときには、抜ける条件が2ということになります。
ちが〜うっ!!
説明するのもばかばかしくなりますね。
マグさんの今までの書き込みを見ると、
あまりにも自分で調べなさすぎです。
他力本願もいいですが、少し自分の力で調べてから
聞くのがマナーですよ。
FOR文の中で毎回iを0クリアしているなら無限ループにも
なるでしょうけれど、どう見ても1になったら抜けるんじゃ
ありませんか?
試してみればわかりますよ。

編集 削除
魔界の仮面弁士  2004-07-10 14:44:21  No: 114702  IP: [192.*.*.*]

》 DANさん
>> For i As Integer = 0 To i + 1
> VB4,5,6しか使った事ないけど、
> この書き方ってありなんですか?
この構文は、.NET 1.1 (VB.NET 2003)以上にて利用可能です。

この方法では、iという変数は「ループ内でのみ用いられる変数」として
宣言されます。なお、この構文は For Each ループでも使用可能です。


》 Maxさん
> Do While 1
>  --- 処理 ---
> Loop
それだと、「Option Strict OnモードのVB.NET」だと、エラーになります。
正しくは、
  Do While True
     '処理
  Loop
ですね。
# 「VB6以下」や、「Option Strict OffモードのVB.NET」であれば、
# 「Do While 1」でも一応は動作しますが、True の方が適切でしょう。

なお、無限ループとしては、
  Do
    '処理
  Loop
と書くだけでもOKです。

> VB6ならCtrl+Breakで止まりますがVB.Netではどうなんでしょう?
中断機能はありますが、キーボードの割り当ては固定ではなく、変更可能です。
Visual Studio.NETの既定の設定では、Ctrl+Alt+Breakですが、
キー割り当てをVB6モードにしておけば、Ctrl+Breakになりますし、
あるいは、自分で決めたキー設定にする事もできます。


》 マグさん
> まず、最初に初期値として、iに0が入ります。
> そして、抜ける条件として、1の場合ということになります。
> 次に、iが1になったときには、抜ける条件が2ということになります。
いえ、そうではありません。
Visual Basic の For ループに指定する『終了値』は、ループの開始時に決定されます。

つまり、
  For counterValue = 0 To counterValue + 1
     '処理
  Next
という処理は、Do〜Loopでいえば、
  counterValue = 0
  Do Until counterValue < counterValue + 1
    '処理
    counterValue += 1
  Loop
のように処理されるわけではなく、
  counterValue = 0
  endValue = counterValue + 1
  Do Until counterValue < endValue
    '処理
    counterValue += 1
  Loop
のように処理される事になります。

編集 削除
魔界の仮面弁士  2004-07-10 14:53:36  No: 114703  IP: [192.*.*.*]

すみません、訂正です…。m(_ _;)m
不等号の向きを逆に書いてしまいました。


最後の説明の所、
|  Do Until counterValue < counterValue + 1
や、
|  Do Until counterValue < endValue
ではなく、以下のように読みかえてください。

  Do Until counterValue > counterValue + 1

  Do Until counterValue < endValue


ちなみに、もしも「Do Until counterValue > counterValue + 1」として
判定される仕様だったとしても、最終的には、ループ変数が
オーバーフロー(System.OverflowException)を発生させて停止するため、
厳密には無限ループとはなりません。

編集 削除
マグ  2004-07-10 19:08:09  No: 114704  IP: [192.*.*.*]

すみませんでした。

for文の使い方の知識不足でした。(TT)

では
Do
    '処理
  Loop
で無限ループにした場合、抜ける方法は
Exit Do
でいいんでしょうか?

編集 削除
魔界の仮面弁士  2004-07-10 21:09:07  No: 114705  IP: [192.*.*.*]

> Exit Do
> でいいんでしょうか?
ですます。

Do〜Loopを抜けるなら、Exit Do。
For〜NextやFor Each〜Nextなら、Exit For。
While〜End Whileなら、Exit Whileです。

編集 削除
マグ  2004-07-10 21:18:36  No: 114706  IP: [192.*.*.*]

ありがとうございました。

解決しました。

あと、未だに
For Each文を一度も使ったことがないのですが、
For文と  どう違うのでしょうか?

編集 削除
nanashi  2004-07-12 10:33:26  No: 114707  IP: [192.*.*.*]

> マグさんの今までの書き込みを見ると、
> あまりにも自分で調べなさすぎです。
> 他力本願もいいですが、少し自分の力で調べてから
> 聞くのがマナーですよ。

激しく同意。
For...Next と For Each...Nextの違いならヘルプ見りゃ載ってるよ。

編集 削除
マグ  2004-07-12 11:07:31  No: 114708  IP: [192.*.*.*]

少し自分で探しているのですが、なぜか、自分の探しているものが見つからないんです。

とりあえず、もう一度、検索で探してみます。

ありがとうございます。

編集 削除