1

C ++で動的配列を操作することに慣れようとしていますが、今日で10回目のように立ち往生しています。プログラムは正常にコンパイルされますが、入力を取得するとスタック オーバーフロー エラーが発生し、コンストラクターでヒープを削除する機能を提供しました。初期化されていない変数があると想定しましたが、実際には見つかりません。皆さんが私がそれをチェックするのを手伝ってくれることを願っています. これはコードです:

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

前もって感謝します。

4

3 に答える 3

3

私が見ることができる1つの問題はCalc::solveFor、等号の代わりに代入演算子を使用していることです:

if (m0=0)

する必要があります

if (m0==0)
于 2012-10-24T05:08:56.447 に答える
1

上記の =/== 問題とは別に、アッカーマン関数を再帰的に計算しているようです。この関数の再帰の深さは、この方法で行うにはあまりにも速く成長します。

代わりに反復アプローチを試すか、メモ化を見てください。

于 2012-10-24T05:13:07.463 に答える
0

アッカーマン関数の値は非常に急速に増加し、m>3オーバーフローintするため、結果に使用します。それが無限再帰の理由かもしれません。

于 2012-10-24T06:43:06.053 に答える