我正在编写一个使用2D数组的程序。用户选择一行和一列;如果至少有一个元素直接与N S E或W匹配,则它会变为'。' 我不断得到一个段错误,因为我经过各种测试和解决问题后相当肯定它会陷入如下top == bottom和bottom == top(或左右)的循环中。由于我需要检查所有四个方面,我需要检查上方和下方。 例如:
0 - + + -
1 + + - -
2 - + - -
3 + + + -
4 - - + -
0 1 2 3
如果用户选择(3,1),则所有+'将变为'。' 我很感激有关如何纠正这个问题的任何建议。此功能的代码如下。 谢谢!
extern int bb_pop(BBoardPtr b, int r, int c) {
char bal;
int curr, curc;
curr = r;
curc = c;
if(b->board[curr][curc] == b->board[curr-1][curc] && curr != 0 && b->board[curr-1][curc] != '.') {
curr--;
bb_pop(b, curr, curc);
b->board[curr][curc] = '.';
count++;
curr = r;
curc = c;
}
if(b->board[curr][curc] == b->board[curr][curc-1] && curc !=0 && b->board[curr][curc] != '.') {
curc--;
bb_pop(b, curr, curc);
b->board[curr][curc] = '.';
count++;
curr = r;
curc = c;
}
if(b->board[curr][curc] == b->board[curr+1][curc] && curr < rows-1 && b->board[curr+1][curc] != '.') {
curr++;
bb_pop(b, curr, curc);
b->board[curr][curc] = '.';
count++;
curr = r;
curc = c;
}
if(b->board[curr][curc] == b->board[curr][curc+1] && curc<cols-1 && b->board[curr][curc] != '.') {
curc++;
bb_pop(b, curr, curc);
b->board[curr][curc] = '.';
count++;
curr = r;
curc = c;
}
if(count > 0) {
b->board[r][c] = '.';
}
printf("count %i\n", count); /////////////fix count
return count;
}
答案 0 :(得分:1)
在功能的顶部执行此操作:
charToFind = b->board[r][c];
b->board[r][c] = '.';
count = 1;
然后使用charToFind
代替board[curr][curc]
,并删除所有board[curr][curc]='.'
,因为您的递归函数会执行此操作。这应该是你的主体看起来像:
if (r != 0 && b->board[r-1][c] == charToFind)
count += bb_pop(b, r-1, c);
if (r < rows-1 && b->board[r+1][c] == charTofind)
count += bb_pop(b, r+1, c);
// Do the same thing for the c-1 and c+1 cases.
有一点需要注意的是,如果您的电路板很大,您可能会进入非常大的深度并溢出堆栈。