分段错误[2D数组]

时间:2016-09-06 12:56:16

标签: c++ multidimensional-array segmentation-fault

#include <iostream>

using namespace std;

void input_Array(char (&A)[10][10], int x, int y);
int calc_Collision(char (&A)[10][10]);
void display(char (&A)[10][10]);
void init_Array(char (&A)[10][10]);

int main()
{
  int m,n,test;
  char A[10][10];
  init_Array(A);
  cin>>test;
  while (test>0)
  {
    cin>>m>>n;
    input_Array(A,m,n);
    display(A);
    cout<<"FLAG";
    cout<<calc_Collision(A);
    test--;
  }
}

//Calculates no. of ways to select two 1's in each column
int calc_Collision(char (&A)[10][10])
{
  int count=0;
  int sum=0;
  int select(int x, int y);
  for (int j = 0; j<10; j++)
  {
   count=0;
    for(int i = 0; i<10; i++)
    {
      if (A[i][j]=='1')
      {
        count++;
      }
    }
    sum=sum + select(count,2);
  }
  return sum;
}

//Returns no. of ways to select y items from x items
int select(int x, int y)
{
  int fact(int a);
  return (fact(x)/(fact(y)*fact(x-y)));
}

//Returns a!
int fact(int a)
{
  if (a==0)
  {
    return 1;
  }
  else
  {
    return (a*fact(a-1));
  }
}

void display(char (&A)[10][10])
{
  for (int i=0; i<10; i++)
  {
    for (int j=0; j<10; j++)
    {
      cout<<A[i][j]<<"\t";
    }
    cout<<"\n";
  }
}

输入格式:

没有。试验

没有。行(空格)没有。列

row1(无空格,仅限1或0)

... ROW2

输出:

2D数组

总数没有。如何在每列中选择两个一个

问题:

程序显示数组足够好。

但是在遇到calc_Collision(A)时,代码输出:

分段错误(核心转储)

不显示“FLAG”。

这里仍然是初学者,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

int select(int x, int y){
  int fact(int a);
  return (fact(x)/(fact(y)*fact(x-y)));
}


int fact(int a){
  if (a==0)  {
    return 1;
  }
  else  {
    return (a*fact(a-1));
  }
}

请注意,如果x中的select小于2,那么fact(x-y)将无限期地调用自身。这是因为a中的变量fact将为负数。当输入数组的大小少于10列时,会发生这种情况,导致最后一列变为空。这导致count的迭代在calc_Collision中变为0。如果输入有10列,则不会发生分段错误。  由于您只计算nC2(N选择2),select函数可以重写为:

int select(int x){
  return (x*(x-1))/2;
}