【问题标题】:Error: cannot convert 'int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]' to 'int (*)[100]' for argument '1' to 'int determ(int (*)[100], int)'|错误:无法将参数 '1' 的 'int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]' 转换为 'int (*)[100]' 到 'int确定(int (*)[100], int)'|
【发布时间】:2014-10-06 06:06:13
【问题描述】:

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

#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;
}

【问题讨论】:

  • 我刚刚回答了一个类似的问题。请看stackoverflow.com/a/26210551/434551
  • 您将永远使该功能正常工作。考虑在不递归的情况下重写整个程序。

标签: c++ arrays recursion


【解决方案1】:

你的原型是 双行列式(双矩阵[100][100], int order)

然后你用 行列式(elem,n); 什么时候 双元素[n][n];这是一个“动态”数组大小,所以不是 100x100

it seam 编译器在编译时假定 n 为 1,所以 显然双数组[1][1]不能转换为[100][100]

当您编写它时,即使您的输入矩阵数据是 1x1,您也必须将其存储在 100x100 数组中。 只需声明 double elem[100][100]; 最后在运行时确保用户输入 n

【讨论】:

    【解决方案2】:

    你有三个问题。

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      您的奇怪错误消息是编译器试图支持 double elem[n][n] 作为扩展的结果,但没有很好地完成它。

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

      要修复它而不浪费内存并坚持使用标准 C++,您应该使用 std::vector 而不是 C 样式的数组。使用向量的向量编写代码更简单,但出于性能原因,您可能希望使用一维向量。

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

      【讨论】:

        猜你喜欢
        • 2013-01-21
        • 1970-01-01
        • 2015-06-12
        • 2018-11-25
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多