2014-10-06 138 views
0

我有这个错误,但我相信我有相同的数据类型,我没有做任何错误,我想。它用于计算矩阵的行列式。有人帮忙。我实在想不出为什么我有这样的错误:(错误:无法将参数'1'转换为'int(*)[(((sizetype)(((ssizetype)n)+ -1))+ 1)]'''int(*)[100] int determine(int(*)[100],int)'|

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

我刚刚回答了一个类似的问题。请看http://stackoverflow.com/a/26210551/434551 – 2014-10-06 06:09:42

+0

非常感谢你! – Jessie 2014-10-06 06:19:08

+0

您将不会获得该功能。考虑重写整个程序而不递归。 – Lundin 2014-10-06 06:21:54

回答

1

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

您离奇的错误消息是编译器的尝试结果支持double elem[n][n]作为一个扩展,但没有做它的一个很好的工作。

一种方法来解决,这将是改变你的代码double elem[100][100];

要修复它不浪费备忘录ry并坚持使用标准C++,则应该使用std::vector而不是C风格的数组。编码使用矢量矢量更简单,但出于性能原因,您可能需要使用一维矢量。

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

1

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

和你 决定(ELEM,n)的调用它; 当 双elem [n] [n];这是一个“动态”数组大小所以不是100×100

它接缝编译器假定n是1在编译时间,以便 明显双阵列[1] [1]不能被转换为[100] [100]

即使您的输入矩阵数据为1x1,您也必须将其存储在100x100阵列中。 只声明双elem [100] [100]; 终于在运行时确保用户输入n < 100以避免错误

1

您有三个问题。

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

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

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

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

严格地说你不需要这么做,但如果你正在计算小矩阵的行列式也不会浪费这么多的内存为100×100矩阵。

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