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

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

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

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

Q&A

解決済

3回答

1917閲覧

C++:forループの二周目以降で動作がストップする

nanameko

総合スコア17

C++

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

0グッド

0クリップ

投稿2018/08/08 03:52

forループを使用したところ、
「~.exeは動作を停止しました」と表示されてしまいました。
そこで、::SetConsoleTitleを使用して問題の発生箇所を特定したところ、
少なくとも一周目が終わったあとだということが判明しました。

しかし、コンパイルエラーも出ていないため原因がわかりません。
原因と解決方法を教えていただきたいです。よろしくおねがいします。

###開発環境
VisualStudio2018(Release,x64)
Windows8.1 64ビット

###問題が発生している箇所のソースコード

lang

1int analysis()//解析関数 2{ 3 ::SetConsoleTitle(TEXT("リスト解析中")); 4 int a = 0; 5 int b[4] = { 0,0,0,0 }; 6 for (int i = 0; i < imgnum; i++)/*内部のforループに問題はない。一周目は動作する。 7 タイトルバーが「リスト解析途中だよ」と表示されているときに 8 動作がストップする。*//*ERROR*/ 9 { 10 vector<string> v = split(strdata[i], ' '); 11 imgdata_pass[i] = v[0];//画像パス代入 12 a = stoi(v[1]); 13 for (int j = 0 ; j<a ; j++) 14 { 15 b[0] = stoi(v[2+j*4]);//string型をint型に変換 16 b[1] = stoi(v[3+j*4]); 17 b[2] = stoi(v[4+j*4]); 18 b[3] = stoi(v[5+j*4]); 19 20 imgdata_box[i][j][0] = b[0];//短形情報を代入 21 imgdata_box[i][j][1] = b[1]; 22 imgdata_box[i][j][2] = b[2]; 23 imgdata_box[i][j][3] = b[3]; 24 ::SetConsoleTitle(TEXT("リスト解析途中だよ")); 25 } 26 } 27 ::SetConsoleTitle(TEXT("リスト解析終了")); 28 return 0; 29}

###全体のソースコード(問題の箇所ではありませんが、OPENCVを使用しています)

lang

1#include <fstream> //ファイル入出力用 2#include <iostream> //ファイル入出力用 3#include <string> //String型使用をする用 4#include <opencv2/opencv.hpp> //画像サイズ取得用 5#include <stdio.h> //タイトルバー設定用 6#include <windows.h> //タイトルバー設定用 7#include <vector> //可変長配列使用をする用 8#include <sstream> //stoi用(stringからint) 9using namespace std; 10 11const int imgnum = 7600;//配列の数 12string strdata[7600];//読み込んだままのテキスト 13string outputtext;//出力するテキスト 14 15string imgdata_pass[7600];//画像のパス 16int imgdata_box[7600][15][4];//短形情報 17int imgdata_size[7600][2];//画像サイズ 18 19int road()//読み込み関数 20{ 21 ifstream ifs("annotation.txt"); 22 string str; 23 if (ifs.fail()) 24 { 25 cerr << "リストファイルが読み込めません" << endl; 26 return -1; 27 } 28 int i = 0; 29 ::SetConsoleTitle(TEXT("リスト読み込み中")); 30 while (getline(ifs, str)) 31 { 32 strdata[i] = str; 33 i++; 34 } 35 return 0; 36} 37 38 39vector<string> split(const string &str, char sep)//分割関数 40{ 41 vector<string> v; 42 stringstream ss(str); 43 string buffer; 44 while (getline(ss, buffer, sep)) 45 { 46 v.push_back(buffer); 47 } 48 return v; 49} 50 51int analysis()//解析関数 52{ 53 ::SetConsoleTitle(TEXT("リスト解析中")); 54 int a = 0; 55 int b[4] = { 0,0,0,0 }; 56 for (int i = 0; i < imgnum; i++)/*内部のforループに問題はない。一周目は動作する。 57 タイトルバーが「リスト解析途中だよ」と表示されているときに 58 動作がストップする。*//*ERROR*/ 59 { 60 vector<string> v = split(strdata[i], ' '); 61 imgdata_pass[i] = v[0];//画像パス代入 62 a = stoi(v[1]); 63 for (int j = 0 ; j<a ; j++) 64 { 65 b[0] = stoi(v[2+j*4]);//string型をint型に変換 66 b[1] = stoi(v[3+j*4]); 67 b[2] = stoi(v[4+j*4]); 68 b[3] = stoi(v[5+j*4]); 69 70 imgdata_box[i][j][0] = b[0];//短形情報を代入 71 imgdata_box[i][j][1] = b[1]; 72 imgdata_box[i][j][2] = b[2]; 73 imgdata_box[i][j][3] = b[3]; 74 ::SetConsoleTitle(TEXT("リスト解析途中だよ")); 75 } 76 } 77 ::SetConsoleTitle(TEXT("リスト解析終了")); 78 return 0; 79} 80 81int count(int num) {//要素数カウント関数 82 83 int count = 0; 84 for (int i=0; i < 13; i++) { 85 if (imgdata_box[num][i][2] != NULL) 86 { 87 count++; 88 } 89 } 90 return count; 91} 92 93int trimming()//情報修正関数 OpenCV使用 94{ 95 //画像のサイズを取得 96 ::SetConsoleTitle(TEXT("リスト修正中")); 97 for (int i = 0; i < imgnum; i++) 98 { 99 cv::Mat img = cv::imread(imgdata_pass[i]); 100 if (img.empty()) { 101 cout << "画像が読み込めません" << endl; 102 return 1; 103 } 104 imgdata_size[i][1] = img.rows;//縦 105 imgdata_size[i][0] = img.cols;//横 106 } 107 108 //情報修正 109 int a = 0; 110 for (int i = 0; i < imgnum; i++) 111 { 112 a = count(i); 113 for (int j = 0; j < a; j++) 114 { 115 if (imgdata_box[i][j][0]+imgdata_box[i][j][2]>imgdata_size[i][1])//縦 116 { 117 imgdata_box[i][j][2] = imgdata_size[i][1]-imgdata_box[i][j][0]; 118 } 119 if (imgdata_box[i][j][1] + imgdata_box[i][j][3] > imgdata_size[i][0])//横 120 { 121 imgdata_box[i][j][3] = imgdata_size[i][0] - imgdata_box[i][j][1]; 122 } 123 } 124 } 125 126 return 0; 127} 128int text()//テキスト作成関数 129{ 130 for (int i = 0; i < imgnum; i++) 131 { 132 outputtext += imgdata_pass[i]; 133 outputtext += " "; 134 outputtext += count(i); 135 outputtext += " "; 136 for (int j = 0; j < count(i); j++) 137 { 138 outputtext += to_string(imgdata_box[i][j][0]); 139 outputtext += " "; 140 outputtext += to_string(imgdata_box[i][j][1]); 141 outputtext += " "; 142 outputtext += to_string(imgdata_box[i][j][2]); 143 outputtext += " "; 144 outputtext += to_string(imgdata_box[i][j][3]); 145 outputtext += " "; 146 } 147 } 148 return 0; 149} 150 151int output()//ファイル出力関数 152{ 153 ::SetConsoleTitle(TEXT("リスト出力中")); 154 text(); 155 156 ofstream outputfile("annotation2.txt"); 157 outputfile << outputtext; 158 outputfile.close(); 159 160 return 0; 161} 162 163int main() 164{ 165 road(); 166 analysis(); 167 trimming(); 168 output(); 169 170 return 0; 171}

よろしくおねがいします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

問題はない、と書かれているところにこそ問題はある。という格言があります

a = stoi(v[1]);

for (int j = 0 ; j<a ; j++) { b[0] = stoi(v[2+j*4]);//string型をint型に変換 b[1] = stoi(v[3+j*4]); b[2] = stoi(v[4+j*4]); b[3] = stoi(v[5+j*4]);

ここらへん、数値以外の値が入ってて例外が出てるんじゃないかと思われますが、
VisualStudioを使ってるなら、2周めで止めて、v の値を確認してみてはどうでしょう

投稿2018/08/08 04:17

y_waiwai

総合スコア87774

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

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

0

imgnum の const を外して、

C++

1int imgnum = 7600;//配列の数 2

road() 内で読み込んだ行数を imgnum に保存。

C++

1int road()//読み込み関数 2{ 3 // (途中省略) 4 5 int i = 0; 6 ::SetConsoleTitle(TEXT("リスト読み込み中")); 7 while (getline(ifs, str)) 8 { 9 strdata[i] = str; 10 i++; 11 } 12 13 imgnum = i; // 保存 14 15 return 0; 16} 17

投稿2018/08/08 05:31

daisuke7

総合スコア1563

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

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

0

annotation.txtの中がわからないのでなんとも言えませんが
vの数を調べないでアクセスしていますが、そのあたりは大丈夫でしょうか
((v[2+j*4]とかです)

投稿2018/08/08 04:17

ooa

総合スコア213

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問