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

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

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

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

例外処理

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

C++

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

Q&A

解決済

2回答

1188閲覧

vector型で最後の次を指してしまう例外の解決方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

例外

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

例外処理

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

C++

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

0グッド

0クリップ

投稿2021/02/13 08:57

編集2021/02/13 11:45

以下のコードですが提示画像のように配列の範囲外を指してしまう例外出ます。これは以下のコードをどのように編集したらいいのでしょうか?
提示コード内のコメント部内部のeraseメンバ関数でエラーが起きているのですがこの場合どうすればいいのでしょうか?

cpp

1 2 //弾との当たり判定 3 for (std::vector<MapObject>::iterator it = Area.begin(); it != Area.end();) 4 { 5 std::shared_ptr<std::vector<Bullet>> bullet = play.getBullet(); 6 for (std::vector<Bullet>::iterator itr = bullet->begin(); itr != bullet->end();) 7 { 8 if (Intersect_Rect_2D(itr->mCol, it->mCol) == true) 9 { 10 ObjectType type = it->getObjectType(); 11 12 switch (type) 13 { 14/////////////////////////////////////////////////////////////////////////// 15 //レンガ 16 case ObjectType::Brick: 17 { 18 it = Area.erase(it); 19 20 if (it == Area.end()) 21 { 22 break; 23 } 24 else { 25 it++; 26 } 27 28 } 29 break; 30 31 //ブロック(白レンガ) 32 case ObjectType::Block: 33 { 34 it = Area.erase(it); 35 if (it == Area.end()) 36 { 37 break; 38 } 39 else { 40 it++; 41 } 42 } 43////////////////////////////////////////////////////////////////////////// 44 45 } 46 47 } 48 else 49 { 50 itr++; 51 } 52 } 53 54 if (it == Area.end()) 55 { 56 break; 57 } 58 else { 59 it++; 60 } 61 }

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

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

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

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

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

guest

回答2

0

if (it == Area.end())のあとに書かれたbreak
switchを抜けることしかできないので

もう一度
for (std::vector<Bullet>::iterator itr = bullet->begin(); itr != bullet->end();)のループを実施してしまいます。

おそらくArea.erase(it)の返り値がArea.end()だった場合、エラーになると思います

投稿2021/02/13 12:33

DaiGuard

総合スコア159

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

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

0

ベストアンサー

2番目のforループ内で、Area.erase(it)後、1番目のforループと同じように、itがendかどうかのチェックが必要です。

switch文のなかで、Area.eraseを行ったあと、endかどうかのチェックを行っていますが、これではswitch文のbreakになってしまいます。
2番目のforループを抜けるためには、switch文を抜けた後で、endかどうかのチェックを行ってください。

投稿2021/02/13 09:16

編集2021/02/13 12:12
akiruno-oneone

総合スコア815

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

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

退会済みユーザー

退会済みユーザー

2021/02/13 11:58 編集

提示コードを修正しましたがそれでも依然として例外が発生します。どうすればいいのでしょうか?
退会済みユーザー

退会済みユーザー

2021/02/13 12:49

もう一度はじめか 作ることにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問