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

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

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

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

Q&A

解決済

6回答

1624閲覧

C++: 条件分岐が正しく動かない

stringthread

総合スコア19

C++

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

1グッド

0クリップ

投稿2018/05/18 02:20

C++

1vector<MyClass> data[6]; 2int input[6]={0,0,0,0,0,0}; 3for (i = 0; i < 6; i++) { 4 if (data[i].size() == 0)continue; 5 if (input[i] == 1) { 6 do_something(); 7 } 8}

上記のようなプログラムで、Visual Studio のデバッガで確認すると data[i].size()==0, input[i]==0 にもかかわらず、do_something() が実行されることがあります。まだ発生条件は分からない中の質問で申し訳ないのですが、原因として考えられうる物を教えてください。

Do_you_1isten👍を押しています

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

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

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

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

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

kazto

2018/05/18 02:25

VisualStudioのデバッガを使用しているのであれば、do_something()関数内でブレークを張っておいて、止まった時にバックトレースで呼び元に行って条件文の変数がどうなっているかを確認してみてはいかがでしょうか。
guest

回答6

0

表示ソースだけ見るとあり得ないように見えますが、
その do_something();実行される場合の、iの値はいくつですか。

投稿2018/05/18 02:27

ardin

総合スコア544

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

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

stringthread

2018/05/18 02:35

5回ほど試したのですが、それぞれバラバラの値でした。
ardin

2018/05/18 02:37

i=1~5でバラバラということですか。 その際input[i]はいくつだったのでしょうか。 記載以外でinput[i]に値を入れている可能性は全くありませんか?
ardin

2018/05/18 02:47

data[i].size()==0 この条件がクリアされている時点で、記載外でdata[*]を弄っているでしょうし、 input[*]にも値が入るようになっているような。 またはどこかで変数がバッファオーバーして想定外のことになっている可能性
stringthread

2018/05/18 03:23

dataとinputの値はこのループの前で設定していて、do_something()でも変更していないはずなので、data[i].size()==0とinput[i]==0は変わっていないと思います。
ardin

2018/05/18 03:49

VS2013で試してみましたが発生しないですね。MyClassはintに置き換えましたが。 マルチスレッドでなにかしているのかな。
guest

0

data[i].size()==0, input[i]==0 にもかかわらず、do_something() が実行される

この2つの前提を満たしている、と思ったけど実は違った、というのが可能性としては高いです。

投稿2018/05/18 02:22

maisumakun

総合スコア145183

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

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

0

こんにちは。

原因として考えられうる物を教えてください。

一見ありえない現象ですので、そのような時に考えられる原因は非常に多岐に渡ります。
思いつくものを上げて見ます。

  1. ご提示されていないコードに原因がある(十中八九これです)
  2. コンパイラのバグ
  3. パソコンが壊れかけていてメモリが化けている

「ご提示されていないコードに原因がある」については、例えばループ内に他にも関数呼び出しがあり、それがスタックを破壊しているとか、そもそも提示されているコードとはポイントとなる構造が異なるコードで発生するなどですね。
この問題を回避するには、問題が再現する最小のコードを作って、それを提示されることです。
多くの場合そのようなコードを作っている最中に原因が判明します。判明しなければそれを提示されると良いです。きっと解決します。

投稿2018/05/18 04:05

編集2018/05/18 04:06
Chironian

総合スコア23272

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

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

0

ベストアンサー

paizaで試しましたが再現しませんね。
提示していないコードに要因があるのでは。

投稿2018/05/18 02:44

ttyp03

総合スコア16998

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

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

0

vector<MyClass> data[6];
int input[6]={0,0,0,0,0,0};
for (i = 0; i < 6; i++) {
if (data[i].size() == 0)continue;
if (input[i] == 1) {
std::cout<< "i=" << i << " data[i].size()=" << data[i].size() << " input[i]=" << input[i] << std::endl;//cout debug
do_something();
}
}
の結果はどうなりますか? 

他の場所でdo_something()と同等の処理をする関数、機能はないのですか?
他の部分を削っって実行してみても同じ出力ですか?

投稿2018/05/18 03:53

kaizen_nagoya

総合スコア27

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

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

0

マルチスレッドの場合ならばありえそうですね

投稿2018/05/18 03:44

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問