Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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; };_C++_Stack Overflow - Fatal编程技术网

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; };

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; };,c++,stack-overflow,C++,Stack Overflow,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;

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;
}
提前感谢。

我在Calc::solveFor中看到的一个问题是,您正在使用赋值运算符代替等式:

if (m0=0)
应该是

if (m0==0)
我在Calc::solveFor中看到的一个问题是,您正在使用赋值运算符代替等式:

if (m0=0)
应该是

if (m0==0)

除了上面提到的=/==问题之外,看起来您正在递归地计算。该函数的递归深度增长太快,无法以这种方式进行:A4,2不可能在任何可处理的时间内通过简单的Ackermann函数递归应用来计算


尝试一种迭代方法,或者看看记忆。

除了上面提到的=/==问题之外,看起来您是在递归地计算。该函数的递归深度增长太快,无法以这种方式进行:A4,2不可能在任何可处理的时间内通过简单的Ackermann函数递归应用来计算


请尝试一种迭代方法,或者看看记忆。

Ackermann函数的值增长非常快,对于m>3,它将溢出用于结果的int。这可能是无限递归的原因。

Ackermann函数的值增长非常快,对于m>3,它将溢出用于结果的int。这可能是无限递归的原因。

迭代方法似乎太庞大,但如果这是我唯一的选择,我将尝试一下Ackermann函数在记忆化方面的效果非常好。使用预先计算的函数值的二维数组,使用标记值(例如-1)初始化,每次调用函数时,检查当前参数==数组位置的值之前是否已经计算过。如果是这样,就使用这个值。如果不是,则计算返回值并将其存储在数组中。这样,您可以节省大量的递归,不再出现堆栈溢出,代码运行速度更快,您可以继续使用递归方法……迭代方法似乎太庞大了,但如果这是我唯一的选择,我将尝试一下Ackermann函数在记忆化方面的效果非常好。使用预先计算的函数值的二维数组,使用标记值(例如-1)初始化,每次调用函数时,检查当前参数==数组位置的值之前是否已经计算过。如果是这样,就使用这个值。如果不是,则计算返回值并将其存储在数组中。这样,您可以节省大量递归,不再出现堆栈溢出,代码运行速度更快,并且可以继续使用递归方法……您的构造函数不应该立即释放它分配的内存。将删除循环移动到析构函数。构造函数不应立即释放它分配的内存。将delete循环移动到析构函数。