質問編集履歴

1

コンピュータ将棋プログラムのdebugができない

2015/12/23 03:37

投稿

ozil10
ozil10

スコア36

test CHANGED
File without changes
test CHANGED
@@ -1,313 +1,67 @@
1
1
  [こちら](http://homepage1.nifty.com/Ike/ComShogi/01.html)のサイトを参考にコンピュータ将棋を作成中です。
2
2
 
3
- 今回質問したいのは、C++のデバッグ方法です。理想はRailsでいう`binding.pry`とかで処理を止めて変数の中身を見たいのですが、C++ ではどのようにすれば良いのでしょうか
3
+ 今回質問したいのは、C++のデバッグ方法です。理想はRailsでいう`binding.pry`とかで処理を止めて変数の中身を見たいのです。
4
4
 
5
5
 
6
6
 
7
- 具体的には以下ののよな長さ各所変数中身、配列の中身が見です。
7
+ そこでマンラインからデバッグしたい衝動にかられていたこともあり、macに標準で備わっているとい`lldb`を使ってこ[サイト](http://homepage1.nifty.com/Ike/ComShogi/02.html)chapter2をデバッグしてみまし。以下打ち込んだコマンドです。
8
8
 
9
9
 
10
10
 
11
- ```
12
-
13
- // 局面のクラス
14
-
15
- class Kyokumen {
16
-
17
- public:
18
-
19
- // 桂馬の利きがbanからはみ出すので、はみ出す分を確保しておきます。
20
-
21
- // C++では、構造体の内部の変数の並び順は宣言した順になることを利用しています。
22
-
23
- // 普通はあまり使わない「汚い」テクニックですけど、こういうテクニックもあるということで。
24
-
25
- KomaInf banpadding[16];
26
-
27
- // 2次元配列を使うと遅いので、1次元配列を使います。また、掛け算の際に、*9とかを用いるよりも、
28
-
29
- // 2の階乗を掛け算に使うと掛け算が早くなるので、*16を使います。
30
-
31
- // 駒の位置は、例えば7七なら、7*16+七のようにあらわします。
32
-
33
- // つまり、7七なら16進数で0x77になるわけです。
34
-
35
- KomaInf ban[16*11];
11
+ makefileでコンパイルしたあと、
36
12
 
37
13
 
38
14
 
39
- // 駒の利きを保持します。敵の駒と自分の駒の利きは別々に保持します。
15
+ lldb ./shogi
40
16
 
41
- Kiki controlS[16*11];
17
+ b kyokumen.c:29
42
18
 
43
- Kiki controlE[16*11];
44
-
45
-
46
-
47
- // 持ち駒です。王が持ち駒になることはないので、EHIまでで十分です。
48
-
49
- // Hand[SFU]が1なら先手の持ち駒に歩が1枚、Hand[EKI]が3なら敵の持ち駒に金が3枚という要領です。
50
-
51
- int Hand[EHI+1];
52
-
53
-
54
-
55
- // この局面の手数です。
56
-
57
- int Tesu;
58
-
59
-
60
-
61
- // 互いの玉の位置です。
62
-
63
- int kingS;
64
-
65
- int kingE;
66
-
67
-
68
-
69
- protected:
70
-
71
- void InitControl();
72
-
73
- int Utifudume(int SorE,int to,int *pin);
74
-
75
- void MoveKing(int SorE,int &teNum,Te *teTop,Kiki kiki); //玉の動く手の生成
76
-
77
- void MoveTo(int SorE,int &teNum,Te *teTop,int to,int *pin); //toに動く手の生成
78
-
79
- void PutTo(int SorE,int &teNum,Te *teTop,int to,int *pin); //toに駒を打つ手の生成
80
-
81
- Kiki CountControlS(int pos);
82
-
83
- Kiki CountControlE(int pos);
84
-
85
- Kiki CountMove(int SorE,int pos,int *pin);
86
-
87
- void AddMoves(int SorE,int &teNum,Te *teTop,int from,int pin,int Rpin=0);
88
-
89
- void AddStraight(int SorE,int &teNum,Te *teTop,int from,int dir,int pin,int Rpin=0);
90
-
91
- void AddMove(int SorE,int &teNum,Te *teTop,int from,int diff,int pin,int Rpin=0);
92
-
93
-
94
-
95
- public:
96
-
97
- inline int search(int pos,int dir) const {
98
-
99
- do {
100
-
101
- pos+=dir;
102
-
103
- }while(ban[pos]==EMPTY);
104
-
105
- return pos;
106
-
107
- }
19
+ r
108
-
109
- Kyokumen() {};
110
-
111
- Kyokumen(int tesu,KomaInf ban[9][9],int Motigoma[]);
112
-
113
- void Print() {
114
-
115
- FPrint(stdout);
116
-
117
- }
118
-
119
- void FPrint(FILE *fp);
120
-
121
- void MakePinInf(int *pin) const;
122
-
123
- int MakeLegalMoves(int SorE,Te *tebuf,int *pin=NULL);
124
-
125
- int AntiCheck(int SorE,Te *tebuf,int *pin,Kiki control);
126
-
127
- void Move(int SorE,const Te &te);
128
-
129
- };
130
20
 
131
21
 
132
22
 
133
23
 
134
24
 
135
- // ピン(動かすと王を取られてしまうので動きが制限される駒)の状態を設定する
136
-
137
- void Kyokumen::MakePinInf(int *pin) const
138
-
139
- {
140
-
141
- int i;
142
-
143
- // ピン情報を設定する
144
-
145
- for (i = 0x11; i <= 0x99; i++) {
146
-
147
- // 0はピンされていない、という意味
148
-
149
- pin[i] = 0;
150
-
151
- }
152
-
153
- if (kingS) { //自玉が盤面にある時のみ有効
154
-
155
- for (i = 0; i < 8; i++) {
156
-
157
- int p;
158
-
159
- p = search(kingS, Direct[i]);
160
-
161
- if ((ban[p] != WALL) && !(ban[p] & ENEMY)) { //味方有る
25
+ ブレイクポイントを設定し`kyokumen.c`の29行目で止めたかったのですが、、普通に`./shogi`コマンドを打ったときように将棋プログラム起動してしまい止まったかどうかがわかりません。
162
-
163
- if (controlE[p]&1<<(16+i)) {
164
-
165
- pin[p]=Direct[i];
166
-
167
- }
168
-
169
- }
170
-
171
- }
172
-
173
- }
174
-
175
- if (kingE) { //敵玉が盤面にある時のみ有効
176
-
177
- for (i = 0; i < 8; i++) {
178
-
179
- int p;
180
-
181
- p = search(kingE, -Direct[i]);
182
-
183
- if ((ban[p] != WALL) && (ban[p] & ENEMY)) { //敵の駒が有る
184
-
185
- if (controlS[p]&1<<(16+i)) {
186
-
187
- pin[p]=Direct[i];
188
-
189
- }
190
-
191
- }
192
-
193
- }
194
-
195
- }
196
-
197
- }
198
26
 
199
27
 
200
28
 
201
- // 駒の動きとして正しい動きを全て生成する。
202
29
 
203
- int Kyokumen::MakeLegalMoves(int SorE,Te *teBuf,int *pin)
204
30
 
205
- {
206
-
207
- int pbuf[16*11];
208
-
209
- int teNum=0;
210
-
211
- if (pin==NULL) {
212
-
213
- MakePinInf(pbuf);
31
+ 理想は以下のような形で止めたいです。
214
-
215
- pin=pbuf;
216
-
217
- }
218
-
219
- if (SorE==SELF && controlE[kingS]!=0) {
220
-
221
- return AntiCheck(SorE,teBuf,pin,controlE[kingS]);
222
-
223
- }
224
-
225
- if (SorE==ENEMY && controlS[kingE]!=0) {
226
-
227
- return AntiCheck(SorE,teBuf,pin,controlS[kingE]);
228
-
229
- }
230
32
 
231
33
 
232
34
 
233
- int suji,dan;
234
35
 
235
- int StartDan,EndDan;
236
36
 
237
- // 盤上の駒を動かす
37
+ (lldb) r
238
38
 
239
- for(suji=0x10;suji<=0x90;suji+=0x10) {
39
+ Process 93890 launched: '/Path/To/hoge' (x86_64)
240
40
 
241
- for(dan=1;dan<=9;dan++) {
41
+ Process 93890 stopped
242
42
 
243
- if (ban[suji+dan]&SorE) {
43
+ * thread #1: tid = 0x53c0ae, 0x0000000100000f23 hoge`main(argc=1, argv=0x00007fff5fbff460) + 51 at hoge.c:6, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
244
44
 
245
- AddMoves(SorE,teNum,teBuf,suji+dan,pin[suji+dan]);
45
+ frame #0: 0x0000000100000f23 hoge`main(argc=1, argv=0x00007fff5fbff460) + 51 at hoge.c:6
246
46
 
247
- }
47
+ 3 int main(int argc, char **argv) {
248
48
 
249
- }
49
+ 4 char *test = "This is a debug demo.";
250
50
 
251
- }
51
+ 5 char *name = "edo";
252
52
 
253
- // 歩を打つ
53
+ -> 6 int age = 20;
254
54
 
255
- if (Hand[SorE|FU]>0) {
55
+ 7
256
56
 
257
- for(suji=0x10;suji<=0x90;suji+=0x10) {
57
+ 8 printf("Name: %s, Age: %d\n", name, age);
258
58
 
259
- // 二歩チェック
59
+ 9
260
60
 
261
- int nifu=0;
262
-
263
- for(dan=1;dan<=9;dan++) {
264
-
265
- if (ban[suji+dan]==SorE|FU) {
266
-
267
- nifu=true;
268
-
269
- break;
61
+ (lldb)
270
-
271
- }
272
-
273
- }
274
-
275
- if (nifu) continue;
276
-
277
- //(先手なら2段目より下に、後手なら8段目より上に打つ)
278
-
279
- if (SorE==SELF) {
280
-
281
- StartDan=2;
282
-
283
- EndDan=9;
284
-
285
- } else {
286
-
287
- StartDan=1;
288
-
289
- EndDan=8;
290
-
291
- }
292
-
293
- for(dan=StartDan;dan<=EndDan;dan++) {
294
-
295
- // 打ち歩詰めもチェック
296
-
297
- if (ban[dan+suji]==EMPTY && !Utifudume(SorE,dan+suji,pin)) {
298
-
299
- teBuf[teNum++]=Te(0,suji+dan,SorE|FU,EMPTY);
300
-
301
- }
302
-
303
- }
304
-
305
- }
306
-
307
- }
308
-
309
- ```
310
62
 
311
63
 
312
64
 
65
+
66
+
313
- ただコードを眺めていてもよくわらないのでこまめに処理の動きをみたいです。良い方法ございましたらご教示い。
67
+ 解決方法ございましたらご教示いたきたです