我有这个错误,但我确定我有相同的数据类型,我想我没有做错任何事。它用于计算矩阵的行列式。有人帮忙。我真的想不起为什么我有这个错误:(
#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 :(得分: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]自己计算索引。