2012-10-24 288 views
1

我正試圖讓自己習慣於在C++中使用動態數組,現在被困在今天的第十次。程序編譯得很好,但是在輸入之後,它給出了堆棧溢出錯誤,並且我提供了刪除構造函數中的堆的功能,我假定我有一個未初始化的變量,但是我真的無法找到它。我希望你們能幫我檢查一下。這是代碼:C++堆棧溢出錯誤

#include<string> 
#include<cmath> 
#include<sstream> 
using namespace std; 
#include"Calc.h" 
#include<iostream> 
using namespace std; 

Calc::Calc(int a, int*b){ 
length=a; 
ar=b; 
AR =new int*[length]; 


for (int i=0; i<length;i++){ 
    AR[i] = new int [ar[i]](); 
    } 

for (int i = 0; i < length; i++) 
    delete[] AR[i]; 
    }; 

Calc::~Calc(){}; 

int Calc::solveFor(int m0, int n0){ 
int ans=0; 
if (m0=0) {ans =n0+1; AR[m0][n0]=ans; return n0+1;} 
if (n0=0) {ans= solveFor(m0-1,1); AR[m0][n0]=ans;return ans;} 
else {ans=solveFor(m0-1, solveFor(m0, n0-1));AR[m0][n0]=ans; return ans;} 
}; 



void Calc::getSolved(){ 
for(int i=0; i<=length; i++){cout<<endl; 
    for (int j=0; j<ar[i]; j++) 
     cout<<"ACK ["<<i<<","<<j<<"]="<<AR[i][j]<<" ";} 
    cout<<endl; 


}; 

的Run.cpp:

#include<iostream> 
#include<string> 
#include "Calc.h" 

using namespace std; 

int main() { 
int m; 
int n; 
int v[6]= {7, 7, 7, 7, 7, 7}; 
Calc XXX(6, v); 
cin>>m; 
cin>>n; 


XXX.solveFor(m,n); 
XXX.getSolved(); 

    return 0; 
} 

在此先感謝。

+0

你的*構造函數*不應該立即釋放它分配的內存。將'delete'循環移至*析構函數*。 – molbdnilo

回答

3

一個問題,我可以在Calc::solveFor看到的是正在使用的賦值運算符到位平等:

if (m0=0) 

應該

if (m0==0) 
+0

tnx對我來說..愚蠢的我 –

1

除了上面提到的=/==問題,它看起來像你遞歸計算Ackermann function。這個函數的遞歸深度增長速度太快,不能這樣做:「A(4,2)不可能通過簡單遞歸應用Ackermann函數在任何易處理的時間內計算出來。」

嘗試使用迭代方法,或者查看記憶。

+0

迭代的方法似乎太笨重,但如果它是我唯一的選擇,我會試一試 –

+0

Ackermann函數對記憶的作用非常好。使用預先計算的函數值的2維數組,使用標記值(例如-1)進行初始化,並且每次調用該函數時,檢查當前參數(==數組位置)的值是否已經先前計算過。如果是這樣,請使用該值。如果不是,則計算並將返回值存儲在數組中。這樣,您可以節省大量遞歸,不會出現堆棧溢出,代碼運行速度更快,您可以使用遞歸方法... – lbruder

0

Ackermann函數的值增長非常迅速,對於m>3,它會溢出int,您將其用於結果。這可能是無限遞歸的原因。