2015-01-02 1 views
0

C에서 너무 깊은 재귀에 문제가 있습니다 (Codeblocks를 사용하고 있습니다). 재귀 깊이가 73000 인 경우 Segmentation fault (코어 덤프) 오류가 발생합니다. 가능한 가장 깊은 재귀 깊이는 크기 * 크기입니다 (크기에 대한 코드를보십시오). 나는 솔루션을 찾고되었으며,이 개 솔루션을 통해 온딥 재귀 오류

void sosedi(int *h, int spin, int k, int l, int rec, gsl_rng * r1){ 
rec+=1; 


if(rec>70000) printf("%d\n",rec); 
double tc=2.269185; 
double temp = tc*0.5; 



*(h+k*size+l)=-*(h+k*size+l); 
if(k!=size-2 && *(h+(k+1)*size+l)==spin && pow(2.71828182845904523536, -2*J/temp) < gsl_rng_uniform (r1) ){ 
sosedi(h,spin,k+1,l,rec,r1); 
} 
if(k!=1 && *(h+(k-1)*size+l)==spin && pow(2.71828182845904523536, -2*J/temp) < gsl_rng_uniform (r1) ){ 
sosedi(h,spin,k-1,l,rec,r1); 
} 

if(l!=size-2 && *(h+k*size+l+1)==spin && pow(2.71828182845904523536, -2*J/temp) < gsl_rng_uniform (r1)){ 
sosedi(h,spin,k,l+1,rec,r1); 
} 

if(l!=1 && *(h+k*size+l-1)==spin && pow(2.71828182845904523536, -2*J/temp) < gsl_rng_uniform (r1) ){ 
sosedi(h,spin,k,l-1,rec,r1); 
} 

} 

: 내 경우 크기 = 500에서 너무 깊은 수 재귀 250000 아래 기록 반복적으로 실행되는 기능입니다. 첫 번째 프로젝트

--stack="some big number" 

을 작성하는 것입니다 -> 빌드 옵션 -> 링커 설정 -> 다른 링커 옵션은,하지만 작동하지 않습니다. 다른 옵션은 ulimit -s unlimited를 사용하는 것입니다. 터미널에서 사용하는 방법을 알고 있지만 코드 블록에서이 명령을 사용하는 방법을 모릅니다.

재귀 깊이가이 오류의 원인인지는 모르지만 코드는 size = 100 및 size = 200에서 작동합니다. 도움 주셔서 감사합니다.

+3

[웹 사이트 이름] (http://en.wikipedia.org/wiki/Stack_overflow)을주의 깊게 읽으십시오. –

+0

@MohitJain kek lol –

+0

이 스택 오버 플로우는 알고 있지만 스택을 늘릴 수있는 방법이 있습니다. 누구든지 Codeblock에서이를 수행하는 방법을 알고 있다면 매우 행복 할 것입니다. – Jur

답변

2

스택 오버플로의 피해자 인 것 같습니다.

코드 논리를 다시 방문하여 재귀를 피하거나 최소화하거나 많은 컴파일러에서 최적화 된 꼬리 재귀와 유사한 기술을 사용하십시오.

또한 How to convert a recursive function to use a stack

1

확인을 읽을 수 있고, 그 문제를 해결했다. setrlimit 함수를 사용했습니다. Here 은 사용법에 대한 아주 좋은 설명입니다.