Я узнаю о способности моей системы вычислять алгоритм Аккермана как с двумя, так и с тремя параметрами. Для очень малых значений m и n моя система рассчитает и напечатает результаты, возвращаемые из вызовов методов A0 и A1. Однако все, что выше 3 или 4, не возвращается и замораживает терминал, которым я пользуюсь. Моя проблема в том, что я определяю, для каких значений m и n моя машина может вычислить.
Я попытался несколько вещей, чтобы поймать переполнение стека, для всех я знаю, что C ++ не имеет исключения стека переполнения, которое я могу поймать. блоки try-catch не работают. В приведенном ниже коде я использую getrlimit (), чтобы найти ограничение стека, создать местоположение адреса в основном gStackRef. Я вызываю checkStack, рекурсивно проверяя указатель локальной переменной на gStackLimit.
Есть ли лучший способ проверить использование моего стека относительно рекурсивных методов? Также я проверяю наличие ошибок сегмента? Я дам вам знать, что я работаю на терминале 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();
}