質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3111閲覧

例外 [can't increment vector iterator past end]の対処方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/28 05:21

提示コードの/////コメント部の内部のコードですが例外が出てしまいその修正方法がわかりませんgoogle翻訳で
[ ベクトルイテレータを終了を超えてインクリメントできません ]という例外が発生するのですがこれはどうやって解決すればいいのでしょうか?コメント部内部のコードで最後の次が挿入されているのは明確なのですがその修正方法がわかりません。

イメージ説明

cpp

1 2//バレットとの当たり判定 3void Stage::ColPlayer_Bullet(std::shared_ptr<std::vector<Bullet>> bullet) 4{ 5 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 6 { 7 MapChip chip = *itr; //マップチップ 8 for (std::vector<Bullet>::iterator b = bullet->begin(); b != bullet->end();) 9 { 10 if (Box_Collision::Intersect(chip.mCol, b->mCol) == true) 11 { 12 13 switch (chip.mCol.getObjectType()) 14 { 15 //レンガとの当たり判定 16 case StageObjectType::Brick: 17 { 18 chip.HP += -1; //耐久値を減らす 19 if (chip.HP < 0) 20 { 21 /////////////////////// 22 itr = mStage.erase(itr); //ヒットしたブロックを消す 23 ////////////////////// 24 } 25 26 b->mIsHit = true; //ヒットエフェクトを再生 27 b->FixPos(chip.mCol.getPosition()); //バレットの座標を修正 28 } 29 break; 30 31 32 //ブロックとの当たり判定 33 case StageObjectType::Block: 34 { 35 b->mIsHit = true; //ヒットエフェクトを再生 36 b->FixPos(chip.mCol.getPosition()); //バレットの座標を修正 37 } 38 break; 39 40 41 } 42 } 43 44 //ヒットエフェクトが再生されたy要素を削除 45 if (b->isDelete == true) 46 { 47 ////////////////////// 48 b = bullet->erase(b); 49 ///////////////////// 50 //printf("バレット削除\n"); 51 } 52 else { 53 b++; 54 } 55 } 56 57 } 58} 59

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

例外が発生する時は、itr = mStage.erase(itr);の実行直前のitrがend()の1つ前を指しているのではないでしょうか?
そのような時にこの文を実行するとitrはend()を指します。その後、for文の++itrにてインクリメントされるため、ご提示されているような例外が発生する可能性があります。

以上の推測が正しければ、erase直後にitrがend()に到達していた場合の処理を追加することで、対処できるだろうと思います。

投稿2021/02/28 05:37

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/28 05:47

break等を使ってどうにかする必要があるということでしょうか?でしょうか?w
Chironian

2021/02/28 06:53

処理全体までは把握していないので具体的にどうするのが良いかは分かりませんが、breakで十分なのであれば、それで良いと思います。(2重ループからのbreakですので、内側のループ脱出後、もう一度breakする必要がありますので要注意)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問