-1

我正在尝试用 C++ 编写矩阵行列式函数。但是我的代码无法编译并且不知道为什么(我正在使用在线 c++ 编译器,并且 iget 的错误消息是“ * `/var/www/service/usercode/519646917/a.out' 中的错误: free():下一个大小无效(快速):0x00000000019c1180 * ")。看来问题出在 Free 功能上。

请问谁能告诉我我的代码有什么问题?

提前致谢 问候

    #include <iostream>
    #include <cmath>
    #include <fstream>
    #include <vector>
    #include <numeric>
    #include <iterator>
    #include <map>
    #include <string>

    //C++ clang

    using namespace std;

    void Free(double** a, unsigned int n)
    {
        if (a!=NULL)
        {
            for (unsigned int j=0 ; j<n ; j++)
            {
                delete[] a[j];
            }
            delete[] a;
        }
    }

    double mDeterminant(double** a, unsigned int n)
    {
    if (n==1)
    {
        return a[0][0];
    }
    else if(n==2)
    {
        return a[0][0]*a[1][1]-a[0][1]*a[1][0];
    }
    else
    {
        double res=0.0;
        for (unsigned int i=0 ; i<n ; i++)
        {


            double** A=new double*[n-1];
            for (unsigned int j=0 ; j<n-1 ; j++)
            {
                A[j]=new double[n-1];
            }

            for (unsigned int j=1 ; j<n ; j++)
            {
                unsigned int g=0;
                for (unsigned int k=0 ; k<n ; k++)
                {
                    if (k!=i)
                    {
                        A[j-1][g]=a[j][k]; g++;
                    }
                }
            }

            res+=a[0][i]*pow(-1, i)*mDeterminant(A, n-1);
            Free(A,n-1);
        }
        return res;
    }

   }

    int main()
    {
        unsigned int N=4;
        double** a=new double*[N];
        for (unsigned int i=0 ; i<N ; i++)
        {
            a[i]=new double[N];
        }

        for (unsigned int i=0 ; i < N ; i++)
        {
            for (unsigned int j=0 ; j < N ; j++)
            {
                a[i][j]=(1+i)*(2+j-i);
                cout << a[i][j] << ";";
            }
            cout << endl;
        }


        cout << "----------------------------------" << endl;
        cout << "mDeterminant = " << mDeterminant(a, N) << endl;

    }
4

2 回答 2

0

我相信你唯一的错误(除了main中数组'a'的尺寸)是你定义g的地方。g 应该在这里定义:

 for (unsigned int j=1 ; j<n ; j++)
 {
      unsigned int g= 0;
      for (unsigned int k=0 ; k<n ; k++)
      {
          if (k!=i)
          {
              A[j-1][g]=a[j][k]; g++;
          }
      }
  }

关于其他 n-1 件事,我理解你对它们的意思,我认为它们是正确的

于 2015-08-26T13:00:05.993 回答
0

你有太多错误:

a[i]=new double;应该是a[i]=new double[N];double** A=new double*[n-1];应该是double** A=new double*[n];或者下面的循环应该是直到 n-1。 A[j]=new double[n-1];应该是A[j]=new double[n];或者下面的循环应该是直到 n-1。在这里,A[j-1][g]=a[j][k]; g++;g超出了数组范围。你也没有释放a数组。我想从头开始重写代码更容易,这次想想你在做什么。

于 2015-08-26T12:51:07.550 回答