我陷入了如果top == bottom并且如果bottom == top的循环中

时间:2014-11-16 05:39:02

标签: c recursion segmentation-fault

我正在编写一个使用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;
}

1 个答案:

答案 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.

有一点需要注意的是,如果您的电路板很大,您可能会进入非常大的深度并溢出堆栈。