teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正コード例追加

2015/11/11 05:06

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -15,3 +15,77 @@
15
15
 
16
16
  > 2重ポインタから固定サイズの2次元配列で書き換え、実現することは可能でしょうか。
17
17
  サイズがコマンドライン引数で渡されているので、固定サイズというのは無理な気がします。上記説明は、str関数の中でmalloc/freeが繰り返し実行されないようにするための一つの方法です。
18
+ ---
19
+ なんだか面白そうだったので、実際に試してしまいました。
20
+
21
+ main関数に入る前のところに以下のコードを追加。
22
+ ```C
23
+ struct Arrays
24
+ {
25
+ double **X, **Y, **M1, **M2, **M3, **M4, **M5, **M6, **M7;
26
+ };
27
+
28
+ Arrays *arrays;
29
+ int arrays_size;
30
+ int index = 0;
31
+ ```
32
+
33
+ main関数のA,B,Cをmallocしているところの後ろあたりに以下のコードを追加。
34
+ ```C
35
+ arrays_size = 20;
36
+ arrays = (Arrays *)malloc(sizeof(Arrays) * arrays_size);
37
+ for(int ai = 0; ai < arrays_size; ai++)
38
+ {
39
+ Arrays *ptr = &arrays[ai];
40
+ ptr->X = (double **)malloc(size * sizeof(double *));
41
+ ptr->Y = (double **)malloc(size * sizeof(double *));
42
+ ptr->M1 = (double **)malloc(size * sizeof(double *));
43
+ ptr->M2 = (double **)malloc(size * sizeof(double *));
44
+ ptr->M3 = (double **)malloc(size * sizeof(double *));
45
+ ptr->M4 = (double **)malloc(size * sizeof(double *));
46
+ ptr->M5 = (double **)malloc(size * sizeof(double *));
47
+ ptr->M6 = (double **)malloc(size * sizeof(double *));
48
+ ptr->M7 = (double **)malloc(size * sizeof(double *));
49
+ for(i = 1; i < size; i++)
50
+ {
51
+ ptr->X[i] = (double *)malloc(size*sizeof(double));
52
+ ptr->Y[i] = (double *)malloc(size*sizeof(double));
53
+ ptr->M1[i] = (double *)malloc(size*sizeof(double));
54
+ ptr->M2[i] = (double *)malloc(size*sizeof(double));
55
+ ptr->M3[i] = (double *)malloc(size*sizeof(double));
56
+ ptr->M4[i] = (double *)malloc(size*sizeof(double));
57
+ ptr->M5[i] = (double *)malloc(size*sizeof(double));
58
+ ptr->M6[i] = (double *)malloc(size*sizeof(double));
59
+ ptr->M7[i] = (double *)malloc(size*sizeof(double));
60
+ }
61
+ }
62
+ ```
63
+ `arrays_size = 20;`は本来であればちゃんと計算すべきでしょうけど、手抜きしました。nが100万くらいまではいけると思います。
64
+ あと、main関数から出るところでfreeしてあげてください。
65
+
66
+ str関数の`if (n <= BASE)`の処理の後ろ(`mid = n / 2;`の後ろあたり)に以下のコードを追加。
67
+ ```C
68
+ Arrays *ptr = &arrays[index];
69
+ index++; // これ重要
70
+ X = ptr->X;
71
+ Y = ptr->Y;
72
+ M1 = ptr->M1;
73
+ M2 = ptr->M2;
74
+ M3 = ptr->M3;
75
+ M4 = ptr->M4;
76
+ M5 = ptr->M5;
77
+ M6 = ptr->M6;
78
+ M7 = ptr->M7;
79
+ ```
80
+
81
+ str関数の最後
82
+ ```C
83
+ index--; // これ重要
84
+ return;
85
+ }
86
+ ```
87
+
88
+ str関数内のmallocとfreeの部分は削除してしまってください。
89
+
90
+ 手元の環境でコマンドライン引数を500で試してみましたが、修正前は約2秒で、修正後は約0.5秒でした。効果はあるようです。
91
+

1

説明追加

2015/11/11 05:06

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -9,4 +9,9 @@
9
9
  `for (i = 1; i <= size; i++)`
10
10
  とやっていますが、正しくは
11
11
  `for (i = 1; i < size; i++)`
12
- ですね。
12
+ ですね。
13
+ ---
14
+ 追記です。
15
+
16
+ > 2重ポインタから固定サイズの2次元配列で書き換え、実現することは可能でしょうか。
17
+ サイズがコマンドライン引数で渡されているので、固定サイズというのは無理な気がします。上記説明は、str関数の中でmalloc/freeが繰り返し実行されないようにするための一つの方法です。