Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用递归函数时的分段错误_C++_Recursion_Segmentation Fault - Fatal编程技术网

C++ 使用递归函数时的分段错误

C++ 使用递归函数时的分段错误,c++,recursion,segmentation-fault,C++,Recursion,Segmentation Fault,我对编程非常陌生,对于我的面向对象类(在C++中),我们有一个随机分组为“X”的2d数组。我必须使用递归函数来找到不同的分组并清除它们。现在,我检查点是否是X,清除它,然后检查它周围的8个位置(包括对角线),如果是X中的一个位置,我再次调用函数,但在该位置。我的想法是,如果我找到一个X,我将能够一次性得到它周围的所有X,因此,当我找到一个X时,我可以将它作为一个组来计算 在函数的末尾,我基本上循环了所有的点,如果有另一个X,我会再次调用递归函数。但是,我不断地遇到分段错误,我不知道为什么。任何帮

我对编程非常陌生,对于我的面向对象类(在C++中),我们有一个随机分组为“X”的2d数组。我必须使用递归函数来找到不同的分组并清除它们。现在,我检查点是否是X,清除它,然后检查它周围的8个位置(包括对角线),如果是X中的一个位置,我再次调用函数,但在该位置。我的想法是,如果我找到一个X,我将能够一次性得到它周围的所有X,因此,当我找到一个X时,我可以将它作为一个组来计算

在函数的末尾,我基本上循环了所有的点,如果有另一个X,我会再次调用递归函数。但是,我不断地遇到分段错误,我不知道为什么。任何帮助都将不胜感激


void  Recurssive(string Array[][72],int Pos1, int Pos2)
{

int One=1;
int Two=1;
//cout<<"Test 2";
if(Array[Pos1][Pos2]=="X")
        {
        Array[Pos1][Pos2]="0";
        if(Array[Pos1+1][Pos2]=="X")
                {
                Recurssive(Array,Pos1+1,Pos2);
                }
         if(Array[Pos1-1][Pos2]=="X")
                {
                Recurssive(Array,Pos1-1,Pos2);
                }
         if(Array[Pos1][Pos2+1]=="X")
                {
                Recurssive(Array,Pos1,Pos2+1);
                }
         if(Array[Pos1][Pos2-1]=="X")
                {
                Recurssive(Array,Pos1,Pos2-1);
                }
         if(Array[Pos1+1][Pos2+1]=="X")
                {
                Recurssive(Array,Pos1+1,Pos2+1);
                }
         if(Array[Pos1-1][Pos2-1]=="X")
                {
                Recurssive(Array,Pos1-1,Pos2-1);
                }
         if(Array[Pos1+1][Pos2-1]=="X")
                {
                Recurssive(Array,Pos1+1,Pos2-1);
                }
         if(Array[Pos1-1][Pos2+1]=="X")
                {
                Recurssive(Array,Pos1-1,Pos2+1);
                }

        }

for(int i=1;i<22;i++)
        {
        for(int j=1;j<72;j++)
                {
                if(Array[i][j]=="X")
                        {
                        Recurssive(Array,i,j);
                        }
                }
        }


}


让我们玩一下电脑游戏,看看递归(数组,0,0)的动作。 如果此位置标记为
X
,则将按顺序进行以下阵列访问:

Array[1][0]
Array[-1][0]
Array[0][1]
Array[0][-1]
Array[1][1]
Array[-1][-1]
Array[1][-1]
Array[-1][1]
这些
-1
访问将超出
数组定义的内存,可能读取随机值或导致分段错误

为了解决这个问题,您需要在实际访问董事会之前验证候选职位是否在董事会内部。 比如:

std::optional<std::string> safe_access(std::string Array[][72], int Pos1, int Pos2) {
  if (Pos1 < 0 || Pos1 >= 71) return {};
  if (Pos2 < 0 || Pos1 >= 21) return {};
  return Array[Pos1][Pos2];
}
std::可选安全访问(std::字符串数组[][72],int Pos1,int Pos2){
if(Pos1<0 | | Pos1>=71)返回{};
if(Pos2<0 | | Pos1>=21)返回{};
返回数组[Pos1][Pos2];
}

然后,您可以调用
safe\u access(Array,-1,-1)=“X”
并保证它不会访问
Array

之外的对象。这听起来是了解调试器的一个很好的练习。它将允许您逐步完成代码并找出发生了什么。我建议在只有两个点标有X的空板上尝试它。您的
for
允许
j
最大为71,而在
递归
函数中,可以使用j+1调用它(因此超出了数组的范围)。这与
i
相同,当
j=71
时,您正在访问
f(数组[Pos1][Pos2+1]==“X”)
中的
72
nd索引,由于数组是基于0的,因此该索引是访问范围之外的。不知道,由于缺少(因此-不知道数组的两个维度),是否可以对
i
索引说同样的话,但怀疑它有相同的问题。@Hawky“对于
i
,从技术上讲是一样的-由于这个事实,人们不能确定
i
的索引是一样的,问题中没有显示数组的此维度。人们只能猜测,这可能是一个问题。谢谢你的评论!我让循环转到21和71,但是,它仍然抛出相同的错误?是的,就是这样!非常感谢你!
std::optional<std::string> safe_access(std::string Array[][72], int Pos1, int Pos2) {
  if (Pos1 < 0 || Pos1 >= 71) return {};
  if (Pos2 < 0 || Pos1 >= 21) return {};
  return Array[Pos1][Pos2];
}