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에서 작동합니다. 도움 주셔서 감사합니다.
[웹 사이트 이름] (http://en.wikipedia.org/wiki/Stack_overflow)을주의 깊게 읽으십시오. –
@MohitJain kek lol –
이 스택 오버 플로우는 알고 있지만 스택을 늘릴 수있는 방법이 있습니다. 누구든지 Codeblock에서이를 수행하는 방법을 알고 있다면 매우 행복 할 것입니다. – Jur