私は、2パラメーターバージョンと3パラメーターバージョンの両方でアッカーマンのアルゴリズムを計算するシステムの機能について学習しています。mとnの値が非常に小さい場合、私のシステムはA0およびA1メソッド呼び出しから返される結果を計算して出力します。ただし、3または4を超えるものは返されず、atmを使用している端末がフリーズします。私の問題は、私のマシンが計算できるmとnの値を決定することです。
私はスタックオーバーフローをキャッチするためにいくつかのことを試みました。c++にはキャッチできるstackoverflowexceptionがないことを私は知っています。try-catchブロックは機能しません。以下のコードでは、getrlimit()を使用してスタック制限を見つけ、メインのgStackRefにアドレスの場所を作成します。gStackLimitへのローカル変数ポインターを再帰的にチェックするcheckStackを呼び出します。
再帰メソッドに関連してスタックの使用状況をチェックするより良い方法はありますか?また、セグメンテーション違反をチェックしますか?UNIX端末で実行していることをお知らせします。
#include <cstdlib>
#include <iostream>
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlp);
using namespace std;
int * gStackRef;
int gStackLimit;
void checkStack(void);
int main(int argc, char *argv[])
{
int temp = 0;
gStackRef = &temp;
rlimit myl;
getrlimit(RLIMIT_STACK, &myl);
gStackLimit = (myl.rlim_cur / 3 * 8 / 10) ;/* modified for segment fault */
cout << gStackLimit << "\n";
checkStack();
}
void checkStack()
{
int temp = 0;
int* pVariableHere = &temp;
size_t stackUsage = gStackRef - pVariableHere;
printf("Stack usage: %d / %d \n", stackUsage, gStackLimit);
if(stackUsage > gStackLimit) return;
else checkStack();
}