2017-07-25 59 views
-1

我試圖打印兩個矩陣,矩陣說A和B.當我只是要求矩陣A一個文本文件,我的程序就可以了。但是當我調用另一個矩陣B的文本文件時,我的程序失敗了,留下一個框,指出「newQr.exe中的0x00168a07未處理異常:0xC00000FD:堆棧溢出。」當我將它們稱爲兩個不同的輸入文件時,如何打印兩個矩陣?

這是錯誤的這樣調用兩個文本文件?以下是我的代碼。我正在爲QR Householder方法生成算法。但是因爲我已經在這裏失敗了,所以我不能繼續我的算法。希望知道這裏出了什麼問題。這裏有:

test1.in矩陣答:

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

我無法重現。它可能與實際代碼不同。 – BLUEPIXY

+0

@BLUEPIXY你不能重現的意思是什麼?這是我編程的實際代碼。 – olive

+0

我可以成功運行代碼。如果它是一個實際的代碼,發佈後不會像這樣改變。 – BLUEPIXY

回答

0

我懷疑這是一個問題與您的程序的當前設計:引發的異常是堆棧溢出異常,這意味着您的堆棧已滿。

這是因爲你們都宣佈矩陣A和B在堆棧上,並保留他們一個巨大的空間,你甚至不需要(目前僅適用於可能)。

所以我覺得你haev兩種可能性:要麼你減少分配給你的矩陣,如空間。通過decalring A和B這樣的:

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

或者你可以聲明堆上AB。要做到這一點,我建議你從double[][]改變你的矩陣類型std::vector< std::vector<double> >因爲載體它們的值自動存儲在堆上,你將不必手動使用newdelete

#include <vector> 
int main() 
{ 
    std::vector< std::vector<double> > A, B; // The only modified line !! 
    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(); 
} 

這個小小的修改應該足夠了:)!

+0

我已經添加了'#include ',並且按照您的說法進行了修改。但是當我運行程序時,它說'調試斷言失敗。' – olive

+0

對不起,您必須提供有關錯誤的更多詳情 – Xatyrian

+0

沒關係。我的程序現在成功了,沒有像你所建議的那樣修改。非常感謝您的意見。 – olive

相關問題