2012-10-24 259 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,您将其用于结果。这可能是无限递归的原因。