当我将它们称为两个不同的输入文件时,如何打印两个矩阵?

时间:2017-07-25 10:47:22

标签: c++ matrix segmentation-fault

我尝试打印两个矩阵,比如Matrix A和B.当我只调用矩阵A的一个文本文件时,我的程序没问题。但是当我调用矩阵B的另一个文本文件时,我的程序失败了,留下了一个框,上面写着“newQr.exe中0x00168a07处的未处理异常:0xC00000FD:堆栈溢出。”

这样调用两个文本文件是不对的?以下是我的代码。我正在为QR Householder方法生成算法。但由于我已经在这里失败了,我无法继续我的算法。希望知道这里有什么问题。这是:

test1.in矩阵A:

1.00            -6.00           
34.00           -1644.00            
803.00          -42258.00           
15524.00        -831864.00          
285061.00       -15355806.00       
5153062.00      -278046852.00

test2.in矩阵B:

-1875.00      17976.00        485714.00        -501810.00    
5370.00       409584.00      -973084.00        559740.00 
291495.00     9193128.00     -64643018.00      55199850.00    
6351060.00    175638624.00   -1430791544.00    1249618200.00    
120491745.00  3213894936.00  -27252104806.00   23932788870.00     
2200175790.00 58033455312.00 -498213904852.00  438253167540.00 

这是我的代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>

#define M 6
#define N 2
#define x 6
#define y 4
#define MAX 100

using namespace std;

int main()
{
    double A[MAX][MAX], B[MAX][MAX];
    int i, j;
    ifstream ifp;
    ifp.open("test1.in", ios::in);
    cout << "Matrix A" << setw(40) << endl;
    for(i=0;i<M;i++)
    {
        for(j=0;j<N;j++)
        {
            ifp >> A[i][j];
            cout << setw(20) << A[i][j];
        }   
        cout << endl;
    }
    ifp.close();
    ifp.open("test2.in", ios::in);
    cout << "Matrix B" << setw(40) << endl;
    for(i=0;i<x;i++)
    { 
       for(j=0;j<y;j++)
       {
          ifp >> B[i][j];
          cout << setw(20) << B[i][j];
       } 
       cout << endl;
    }
    ifp.close();
    cin.get();
}

1 个答案:

答案 0 :(得分:0)

我怀疑程序的当前设计存在问题:引发的异常是堆栈溢出异常,这意味着您的堆栈已满。

这是因为你们都在堆栈上声明了矩阵A和B,并为它们保留了一个你甚至不需要的巨大空间(仅限现在可能)。

所以我认为你有两种可能性:要么减少为矩阵分配的空间,例如。通过对A和B进行十分判断:

double A[M][N], B[M][N];

或者您可以在堆上声明AB。为此,我建议您将矩阵的类型从double[][]更改为std::vector< std::vector<double> >,因为向量会自动将其值存储在堆上,您无需手动使用new和{ {1}}。

delete

这个小修改应该足够了:)!