visual studioでの実行継続
私は現在、visual studio 2017でc言語を使ってコードを作成しています。
ビルドもデバックもできるのにデータの数を大きくして実行すると、コマンドプロンプトに出力がされなくなり、すぐに処理を終了して
「続行するには何かキーを押してください」
というように出てしまいます。
具体的には、defineで変数の値を決めているときに、その値が小さい場合には正常に動作し、出力が行われるのに対し、大きい値に変えるとprintfでの出力が行われません。
処理時間がかなりかかってもいいのでデータを大きくした場合にも出力がされるようにしたいのですが、どのようにすればいいですか?
エラーなどは発生していなく、「デバックなしで開始」すると正常終了し、出力だけされない状態です。
発生している問題・エラーメッセージ
n[i][j]の計算が終わりました t[i][j]の計算が終わりました 続行するには何かキーを押してください . . . と出力されますが、出力されるべき部分はここだけではないので、全て出力されるようにしたいです。
該当のソースコード
c言語
1 2#include "stdafx.h" 3#include "time.h" 4#include "stdlib.h" 5#include "stdarg.h" 6#include "assert.h" 7#include "stdbool.h" 8#include "string.h" 9 10#define N 20 11 12int min3(int x, int y, int z) //最小値求める関数 13{ 14 int min = x; 15 16 if (y < min) min = y; 17 if (z < min) min = z; 18 return (min); 19} 20 21 22int max2(int len, int *nums) { //最大値求める関数(引数可変) 23 int i, _max = nums[0]; 24 for (i = 1; i < len; i++) { 25 if (nums[i] > _max) 26 _max = nums[i]; 27 } 28 return _max; 29} 30 31 32int calT(int i, int j, int **t) { 33 34 //int t[7][7]; 35 36 int calT; 37 38 int b[N + 1][N + 1]; 39 int h[N + 1][N + 1][N + 1]; 40 int bh[N + 1][N + 1][N + 1][N + 1]; 41 42 int k; 43 44 int jx = 0; 45 int iy = 0; 46 47 int jb = 0; //固定する横の長さ 48 int jh = 0; //固定する縦の長さ 49 50 int array[5000]; 51 int m; 52 53 54 for (m = 0; m < 5000; m++) { 55 array[m] = 0; 56 } 57 58 m = 0; 59 60 61 calT = 0; //T[i][j]の初期化 62 b[i][j] = 0; 63 h[i][j][b[i][j]] = 0; 64 65 66 67 if (t[i][j] == 0) { //t[i][j]=0のマスの jb, h, b, T は0にする 68 jb = 0; 69 b[i][j] = 0; 70 h[i][j][b[i][j]] = 0; 71 calT = 0; 72 73 } 74 else { //t[i]j]=0でないマスに対する処理 75 for (jx = 1; jx <= j; jx++) { //t[i][j-jx]==0のマスを探す 76 if (t[i][j - jx] == 0) { //jxを1からjまで回し、マス(i,j)から何個左にt=0のマスがあるか探す 77 jb = jx; //固定する底辺jbを決定 78 break; 79 } 80 } 81 82 for (b[i][j] = 1; b[i][j] <= jb; b[i][j]++) { //b(底辺)を1からjbまででそれぞれ固定した時に配置できる長方形を調べる 83 for (iy = 1; iy <= i; iy++) { 84 for (k = 0; k <= b[i][j] - 1; k++) { 85 if (t[i - iy][j - k] == 0) { 86 h[i][j][b[i][j]] = iy; 87 goto loop1; 88 } 89 } 90 }loop1: 91 92 for (h[i][j][b[i][j]] = 1; h[i][j][b[i][j]] <= iy; h[i][j][b[i][j]]++) { 93 94 bh[i][j][b[i][j]][h[i][j][b[i][j]]] = b[i][j] * h[i][j][b[i][j]]; 95 96 //printf("(%d,%d) b=%d h=%d bh=%d\n", i, j, b[i][j], h[i][j][b[i][j]], bh[i][j][b[i][j]]); 97 array[m] = bh[i][j][b[i][j]][h[i][j][b[i][j]]]; 98 m++; 99 } 100 } 101 102 calT = max2((jb + 1)*(iy + 1), array); 103 for (m = 0; m < 5000; m++) { 104 array[m] = 0; 105 } 106 107 } 108 return calT; 109 110} 111 112int array_equal(int array1[N + 1][N + 1], size_t size11, size_t size12, int array2[N + 1][N + 1], size_t size21, size_t size22) 113{ 114 int c = 0; 115 116 // 要素数が違うなら、絶対に一致しない 117 if (size11 != size21 || size21 != size22) { 118 return false; 119 } 120 121 for (size_t i = 1; i < size11; i++) { 122 for (size_t j = 1; j < size21; j++) { 123 if (array1[i][j] != array2[i][j]) { 124 c++; 125 } 126 } 127 }/*printf("c=%d\n", c);*/ 128 129 for (size_t i = 0; i < size11; i++) { 130 for (size_t j = 0; j < size21; j++) { 131 if (array1[i][j] != array2[i][j]) { 132 133 return false; 134 } 135 } 136 }//printf("c=%d\n", c); 137 c = 0; 138 139 return true; 140 141} 142 143int main(void) 144{ 145 146 //int s; //ランダムに埋まっているマスの個数を指定する変数 147 int i, j; //正方形のマス(i,j) 148 int n[N + 1][N + 1]; //入力の正方形のマス(i,j)が埋まっているか否かのバイナリ変数 149 //int r1, r2; //入力の正方形の埋まっているマスを乱数で決める 150 151 152 int t[N + 1][N + 1]; //動的計画法の数値を格納する配列 153 int T[N + 1][N + 1]; //長方形での動的計画法の数値(配置できる長方形の面積の最大値)を格納 154 155 //////////////////////////////*① 入力の正方形を乱数を使って作成*/ 156 157 //srand((unsigned)time(NULL)); 158 159 for (i = 1; i < N + 1; i++) { 160 for (j = 1; j < N + 1; j++) { 161 n[i][j] = 0; 162 } 163 } 164 165 printf("n[i][j]の計算が終わりました\n") 166 167 i = 0; 168 j = 0; 169 170 for (i = 0; i < N + 1; i++) { 171 for (j = 0; j < N + 1; j++) { 172 if (i == 0 || j == 0) { 173 t[i][j] = 0; //t[i][0],t[0][j]は全て0 174 } 175 else if (i != 0 && j != 0) { 176 177 if (n[i][j] == 1) { 178 t[i][j] = 0; 179 } 180 181 else if (n[i][j] == 0) { 182 t[i][j] = 1; 183 } 184 185 } 186 } 187 } 188 189 //printf("t[i][j]の計算が終わりました\n"); 190 191 192 for (i = 1; i <= N; i++) { 193 for (j = 1; j <= N; j++) { 194 195 if (t[i][j] == 1) { 196 197 t[i][j] = min3(t[i - 1][j], t[i][j - 1], t[i - 1][j - 1]) + 1; 198 199 } 200 } 201 } 202 203 printf("t[i][j]の計算が終わりました\n"); 204 205 /////////////////////////////*③マス毎に配置可能な最大の長方形を求める(底辺の長さを固定)*/ 206 207 int jx = 0; 208 int iy = 0; 209 210 int jb = 0; //固定する横の長さ 211 int jh = 0; //固定する縦の長さ 212 213 int b[N + 1][N + 1]; 214 int h[N + 1][N + 1][N + 1]; 215 216 int B[N + 1][N + 1]; //T[i][j]の面積での底辺 217 int H[N + 1][N + 1]; //T[i][j]の面積での高さ 218 219 int bh[N + 1][N + 1][N + 1][N + 1]; 220 221 int k; 222 223 int *tx[N + 1]; 224 225 226 for (i = 0; i < N + 1; i++) { 227 tx[i] = t[i]; 228 } 229 230 /*printf("T[i][j]\n");*/ 231 232 233 for (i = 1; i <= N; i++) { 234 for (j = 1; j <= N; j++) { 235 236 T[i][j] = calT(i, j, tx); 237 238 /*printf("%d ", T[i][j]);*/ 239 } 240 /*printf("\n");*/ 241 } 242 /*printf("\n");*/ 243 244 printf("T[i][j]の計算が終わりました\n"); 245 246 /////////////////////////////*④いくつかの配置方法を試していく*/ 247 248 //データ(面積)を読み込んで配列に格納 249 250 FILE *fp; 251 char *fname = "square.csv"; 252 int ret; 253 int num[201][6]; //ファイルの中にある到着する面積を格納する配列 254 255 256 errno_t err; // errno_t型(int型) 257 err = fopen_s(&fp, fname, "r"); // ファイルを開く。失敗するとエラーコードを返す。 258 if (err != 0) { 259 printf("%s file not open!\n", fname); 260 return err; 261 } 262 else { 263 printf("file open!\n"); 264 } 265 266 267 for (i = 0; i <= 200; i++) { //csvファイルをnumに入れる 268 for (j = 0; j <= 5; j++) { 269 num[i][j] = 0; 270 } 271 } 272 273 for (i = 1; i <= 200; i++) { //numだけは配列が1から始まっていることに注意! 274 for (j = 1; j <= 5; j++) { 275 276 ret = fscanf_s(fp, "%d,", &num[i][j]); 277 278 if (ret != EOF) { 279 /*printf("%d ", num[i][j]);*/ 280 } 281 } 282 if (ret != EOF) { 283 /*printf("\n");*/ 284 } 285 } 286 /*printf("\n");*/ 287 fclose(fp); 288 printf("num[][]への格納が終わりました\n"); 289 290 //読み込んだデータ(面積)が配置可能か否か 291 292 int T_before[N + 1][N + 1]; 293 int len1, len2, len_before1, len_before2; 294 295 296 for (i = 0; i < N + 1; i++) { 297 for (j = 0; j < N + 1; j++) { 298 T_before[i][j] = 0; 299 } 300 } 301 302 len1 = sizeof(T) / sizeof(T[0]); 303 len2 = sizeof(T[0]) / sizeof(T[0][0]); 304 305 len_before1 = sizeof(T_before) / sizeof(T_before[0]); 306 len_before2 = sizeof(T_before[0]) / sizeof(T_before[0][0]); 307 308 printf("Tの行数は%d, Tの列数は%d, T_beforeの行数は%d, T_beforeの列数は%d\n\n", len1, len2, len_before1, len_before2); 309 310 int judge = 0; 311 judge = array_equal(T, len1, len2, T_before, len_before1, len_before2); 312 int c = 0; 313 314 printf("START : judge=%d\n", array_equal(T, len1, len2, T_before, len_before1, len_before2)); 315 //printf("START: c=%d\n", c); 316 317 for (int i_n = 1; i_n <= 200; i_n++) { 318 for (int j_n = 1; j_n <= 5; j_n++) { 319 if (num[i_n][j_n] != 0) { 320 321 for (i = 1; i <= N; i++) { 322 for (j = 1; j <= N; j++) { 323 if (T[i][j] != 0) { 324 if (T[i][j] >= num[i_n][j_n]) { 325 for (jx = 1; jx <= j; jx++) { //t[i][j-jx]==0のマスを探す 326 if (t[i][j - jx] == 0) { //jxを1からjまで回し、マス(i,j)から何個左にt=0のマスがあるか探す 327 jb = jx; //固定する底辺jbを決定 328 break; 329 } 330 } 331 for (b[i][j] = 1; b[i][j] <= jb; b[i][j]++) { //b(底辺)を1からjbまででそれぞれ固定した時に配置できる長方形を調べる 332 for (iy = 1; iy <= i; iy++) { 333 for (k = 0; k < b[i][j]; k++) { 334 if (t[i - iy][j - k] == 0) { 335 h[i][j][b[i][j]] = iy; 336 goto loop2; 337 } 338 } 339 }loop2: 340 341 for (h[i][j][b[i][j]] = 1; h[i][j][b[i][j]] <= iy; h[i][j][b[i][j]]++) { 342 bh[i][j][b[i][j]][h[i][j][b[i][j]]] = b[i][j] * h[i][j][b[i][j]]; 343 344 if (bh[i][j][b[i][j]][h[i][j][b[i][j]]] == num[i_n][j_n]) { 345 B[i][j] = b[i][j]; 346 H[i][j] = h[i][j][b[i][j]]; 347 348 for (int ii = i; ii >= i - (H[i][j] - 1); ii--) { 349 for (int jj = j; jj >= j - (B[i][j] - 1); jj--) { 350 351 t[ii][jj] = 0; //配置した部分のt[i][j]を0にする 352 //T[ii][jj] = 0; 353 354 } 355 }goto loop3; 356 } 357 } //h loop 358 } //b loop 359 } 360 } 361 } 362 }loop3: 363 364 //printf("i=%d j=%d B[i][j]=%d H[i][j]=%d\n\n", i, j, B[i][j], H[i][j]); 365 366 for (i = 0; i < N + 1; i++) { 367 for (j = 0; j < N + 1; j++) { 368 T_before[i][j] = T[i][j]; 369 } 370 } 371 } 372 }//j_n loop 373 }//i_n loop 374 375 return 0; 376} 377 378 379
試したこと
具体的な話になりますが、順番に上から実行していくとT[i][j]の計算を行うあたりから一部しか出力が行われなくなりました。
define Nの部分を10ずつ値を変えて実行しましたが、少なければ少ないほど出力される部分は増えますが、全て出力されることはありませんでした。
visual studioについてデバック機能や計算量、メモリ容量を調べるなどのことについて調べましたが、いまいち原因がわかりません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。