回答編集履歴

2

修正コード例追加

2015/11/11 05:06

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -32,4 +32,152 @@
32
32
 
33
33
  サイズがコマンドライン引数で渡されているので、固定サイズというのは無理な気がします。上記説明は、str関数の中でmalloc/freeが繰り返し実行されないようにするための一つの方法です。
34
34
 
35
+ ---
35
36
 
37
+ なんだか面白そうだったので、実際に試してしまいました。
38
+
39
+
40
+
41
+ main関数に入る前のところに以下のコードを追加。
42
+
43
+ ```C
44
+
45
+ struct Arrays
46
+
47
+ {
48
+
49
+ double **X, **Y, **M1, **M2, **M3, **M4, **M5, **M6, **M7;
50
+
51
+ };
52
+
53
+
54
+
55
+ Arrays *arrays;
56
+
57
+ int arrays_size;
58
+
59
+ int index = 0;
60
+
61
+ ```
62
+
63
+
64
+
65
+ main関数のA,B,Cをmallocしているところの後ろあたりに以下のコードを追加。
66
+
67
+ ```C
68
+
69
+ arrays_size = 20;
70
+
71
+ arrays = (Arrays *)malloc(sizeof(Arrays) * arrays_size);
72
+
73
+ for(int ai = 0; ai < arrays_size; ai++)
74
+
75
+ {
76
+
77
+ Arrays *ptr = &arrays[ai];
78
+
79
+ ptr->X = (double **)malloc(size * sizeof(double *));
80
+
81
+ ptr->Y = (double **)malloc(size * sizeof(double *));
82
+
83
+ ptr->M1 = (double **)malloc(size * sizeof(double *));
84
+
85
+ ptr->M2 = (double **)malloc(size * sizeof(double *));
86
+
87
+ ptr->M3 = (double **)malloc(size * sizeof(double *));
88
+
89
+ ptr->M4 = (double **)malloc(size * sizeof(double *));
90
+
91
+ ptr->M5 = (double **)malloc(size * sizeof(double *));
92
+
93
+ ptr->M6 = (double **)malloc(size * sizeof(double *));
94
+
95
+ ptr->M7 = (double **)malloc(size * sizeof(double *));
96
+
97
+ for(i = 1; i < size; i++)
98
+
99
+ {
100
+
101
+ ptr->X[i] = (double *)malloc(size*sizeof(double));
102
+
103
+ ptr->Y[i] = (double *)malloc(size*sizeof(double));
104
+
105
+ ptr->M1[i] = (double *)malloc(size*sizeof(double));
106
+
107
+ ptr->M2[i] = (double *)malloc(size*sizeof(double));
108
+
109
+ ptr->M3[i] = (double *)malloc(size*sizeof(double));
110
+
111
+ ptr->M4[i] = (double *)malloc(size*sizeof(double));
112
+
113
+ ptr->M5[i] = (double *)malloc(size*sizeof(double));
114
+
115
+ ptr->M6[i] = (double *)malloc(size*sizeof(double));
116
+
117
+ ptr->M7[i] = (double *)malloc(size*sizeof(double));
118
+
119
+ }
120
+
121
+ }
122
+
123
+ ```
124
+
125
+ `arrays_size = 20;`は本来であればちゃんと計算すべきでしょうけど、手抜きしました。nが100万くらいまではいけると思います。
126
+
127
+ あと、main関数から出るところでfreeしてあげてください。
128
+
129
+
130
+
131
+ str関数の`if (n <= BASE)`の処理の後ろ(`mid = n / 2;`の後ろあたり)に以下のコードを追加。
132
+
133
+ ```C
134
+
135
+ Arrays *ptr = &arrays[index];
136
+
137
+ index++; // これ重要
138
+
139
+ X = ptr->X;
140
+
141
+ Y = ptr->Y;
142
+
143
+ M1 = ptr->M1;
144
+
145
+ M2 = ptr->M2;
146
+
147
+ M3 = ptr->M3;
148
+
149
+ M4 = ptr->M4;
150
+
151
+ M5 = ptr->M5;
152
+
153
+ M6 = ptr->M6;
154
+
155
+ M7 = ptr->M7;
156
+
157
+ ```
158
+
159
+
160
+
161
+ str関数の最後
162
+
163
+ ```C
164
+
165
+ index--; // これ重要
166
+
167
+ return;
168
+
169
+ }
170
+
171
+ ```
172
+
173
+
174
+
175
+ str関数内のmallocとfreeの部分は削除してしまってください。
176
+
177
+
178
+
179
+ 手元の環境でコマンドライン引数を500で試してみましたが、修正前は約2秒で、修正後は約0.5秒でした。効果はあるようです。
180
+
181
+
182
+
183
+

1

説明追加

2015/11/11 05:06

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -21,3 +21,15 @@
21
21
  `for (i = 1; i < size; i++)`
22
22
 
23
23
  ですね。
24
+
25
+ ---
26
+
27
+ 追記です。
28
+
29
+
30
+
31
+ > 2重ポインタから固定サイズの2次元配列で書き換え、実現することは可能でしょうか。
32
+
33
+ サイズがコマンドライン引数で渡されているので、固定サイズというのは無理な気がします。上記説明は、str関数の中でmalloc/freeが繰り返し実行されないようにするための一つの方法です。
34
+
35
+