2017-12-17 59 views
0

파이의 근사치와 일치하도록 작업 코드를 첨부합니다.프로세스가 반환 됨 -1073741571 (0xC00000FD)

#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
#include <time.h> 
using namespace std; 

int tabSize=720; //odd number recommended, max 32767 
int precision=10000000; 

long double round=0; 
int number1, number2; 
int main() 
{ 
    long double r=(long double)tabSize/2; 
    long double r2=r*r; 
    int s=tabSize/2+1; 
    int tab[tabSize][tabSize]; 
    for(int i=0;i<tabSize;i++) 
    { 
     for(int j=0;j<tabSize;j++) 
     { 
      if((i-s)*(i-s)+(j-s)*(j-s)<=r2) 
      { 
       tab[i][j]=1; 
      } 
      else 
      { 
       tab[i][j]=2; 
      } 
     } 
    } 
    srand(time(NULL)); 
    for(int i=0;i<precision;i++) 
    { 
     number1=rand()%tabSize; 
     number2=rand()%tabSize; 
     if(tab[number1][number2]==1) 
     { 
      round++; 
     } 
    } 
    round/=precision; 
    long double pi=round*tabSize*tabSize/r2; 
    cout << "Your pi approximation: " << setprecision(50) << pi << endl; 
    return 0; 
} 

모든 작동하지만, 내가 721 이상으로 tabSize을 증가하는 경우, 스크립트 충돌 "프로세스 -1073741571 (0xC00000FD라는)를 반환". 게다가, QT Creator에서 Linux의 경우 tabSize 변수에 최대 1446을 입력 할 수 있기 때문에 CodeBlocks의 최대 값입니다. 1447 이상으로 인해 "프로세스가 -1073741571 (0xC00000FD)을 반환했습니다."와 같은 오류가 발생합니다. 이유가 무엇입니까? 내 잘못은 어디 있니?

+0

['using namespace std;'는 나쁜 습관입니다.] (https://stackoverflow.com/q/1452721/2176813) 절대 사용하지 마십시오. 덧붙여서,'time.h'는 C++에서 사용되지 않는 C 호환성 헤더입니다. 대신'ctime'과 친구를 사용하십시오. – tambre

+0

이 웹 사이트의 이름으로 추락했습니다. 탭 배열이 너무 커서 사용 가능한 스택 공간에 맞지 않습니다. 720 * 720 * 4 = 2 메가 바이트 - 23.5 킬로바이트, 거의 맞지 않는 것 같습니다. 약간 특이한 btw, 기본 스택 공간은 대개 1 메가 바이트입니다. 그러나 ymmv. 1446 * 1446 * 4 = 8 메가 바이트. 도구 모음의 링커 문서에서 스택 크기를 늘리는 옵션을 확인하십시오. –

+0

'int tab [tabSize] [tabSize];'- 이것은 C++가 유효하지 않음에 유의하십시오. C++의 배열은 변수가 아닌 항목 수를 나타 내기 위해 컴파일 타임 상수를 사용하여 선언해야합니다. – PaulMcKenzie

답변

0

어레이에 tab 어레이를 만들고 있지만 스택의 크기는 OS에 따라 다릅니다. tab에 대한 메모리를 힙에 할당해야합니다.

예를 들어, Windows에서 스택의 기본 크기는 1 MB입니다. int720 * 720 * 4 > 1 MB이있는 경우.

+0

감사! 이제 내 코드 : – bartosz325

+1

이렇게 대신 : int tab [tabSize] [tabSize]; 다음과 같이 입력하십시오 : int ** tab = new int * [tabSize]; for (int i = 0; i bartosz325