错误:无法转换' int(*)[(((sizetype)(((ssizetype)n)+ -1))+ 1)]'到' int(*)[100]'争论' 1' to' int determin(int(*)[100],int)' |

时间:2014-10-06 06:06:14

标签: c++ arrays recursion

我有这个错误,但我确定我有相同的数据类型,我想我没有做错任何事。它用于计算矩阵的行列式。有人帮忙。我真的想不起为什么我有这个错误:(

#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;

double determinant(double matrix[100][100], int order)
{
    double det, temp[100][100]; int row, col;

    if (order == 1)
        return matrix[0][0];
    else if (order == 2)
        return ((matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]));
    else
    {
        for (int r = 0; r < order; r++)
        {
            row = 0;
            col = 0;
            for (int i = 1; i < order; i++)
            {
                for (int j = 0; j < order; j++)
                {
                    if (j == r)
                        continue;

                    temp[row][col] = matrix[i][j];
                    col++;
                }
                row++;
            }
            det += (matrix[0][r] * pow(-1, r) * determinant(temp, order - 1));
        }
        return det;
    }
}


int main()
{
    int n;
    cout << "Enter the dimension: ";
    cin >> n;
    double elem[n][n];

    for (int i = 0; i < n; i++)
    {
        cout << "Enter row " << i << ": ";
        for (int j = 0; j < n; j++)
        {
            cin >> elem[i][j];
        }
        cout << endl;
    }

    cout << determinant(elem, n);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

double elem[n][n];在C ++中是非法的。数组必须在编译时具有已知的维度。

您的奇怪错误消息是编译器尝试支持double elem[n][n]作为扩展程序的结果,但却没有做得很好。

解决此问题的一种方法是将代码更改为double elem[100][100];

要修复它而不浪费内存并坚持使用标准C ++,您应该使用std::vector而不是C风格的数组。编码使用矢量矢量更简单,但出于性能原因,您可能需要使用1-D矢量。

此外,您需要稍微重构determinant,因为每次执行递归的另一步时,您都不想分配新的内存。 determinant函数需要知道分配了哪个内存维度,以及要计算决定因素的维度。

答案 1 :(得分:1)

你的原型是 双行列式(双矩阵[100] [100],整数顺序)

你打电话给它 行列式(elem,n); 什么时候 double elem [n] [n];这是一个“动态”数组大小,所以不是100x100

它的seam编译器假设在编译时n为1 显然双数组[1] [1]不能转换为[100] [100]

正如您所写,即使您的输入矩阵数据是1x1,您也必须将其存储在100x100阵列中。 只要声明双元素[100] [100]; 最后在运行时确保用户输入n&lt; 100以避免错误

答案 2 :(得分:1)

你有三个问题。

首先,elem的大小在编译时是未知的。如果你真的想要堆栈上的变量并且矩阵的大小确实是100x100,你应该使用elem [100] [100]。

其次,你的行列式函数在堆栈上创建一个1万个元素矩阵并且它是递归的,这意味着你将获得很多它们并且可能耗尽堆栈空间。您应该考虑使用单个临时矩阵,并在每个递归步骤中重复使用它。

第三,因为你需要矩阵大小它是动态的,所以在堆上声明它。类似的东西:

   double* elem = new double[n * n];

严格地说,你不需要这样做,但如果计算小矩阵的行列式,它不会浪费100x100矩阵的内存。

如果使用一维数组,则可以将任意大小的数组传递给行列式(行列式函数也应该采用一维数组或双*而不是双[100] [100])。您必须使用matrix [order * j + i]自己计算索引。