2017-02-07 2 views
1

아래의 파일은 컴파일되지만 실행되지 않습니다.C++ 파일이 실행되지 않지만 컴파일됩니다.

커서가 몇 번 깜박이면 중지하십시오. 문제가 무엇인지 모르시겠습니까?

런 1e7 슬래브 블록을 떠나는 입자 샘플. 아이디어는 슬래브를 x 방향으로 떠나는 평균 입자 수를 취하는 것입니다.

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <stdint.h> 
#include <iostream> 
#include <cstdlib> 

int main(int argc, char **argv) 
{ 

    int i , J; 
    int numhistories = 1E7; 
    int num_batch = 1E3; 
    char * num_abs; 

    double N1 = 0.25; 
    double Smallsigma1 = 2.0; 
    double N2 = 0.75; 
    double Smallsigma2 = 0.5; 
    double Tsigma = (N1 * Smallsigma1) + (N2 * Smallsigma2); 
    double xmin = 0.0; // Slab geometry 
    double xmax = 5.0; // Slab geometry 


    double x, c , phi; 
    double count = 0, total_num_abs = 0; 
    num_abs = (char*) malloc (J+1); 
    if (num_abs==NULL) exit (1); 

    for (J = 0; J < num_batch; J++) 
     { 
      count = 0; 

      for (i = 1 ; i < numhistories ; i++) 
       { 
        // randomly intialize the x location of a neutron 
        x = xmax * (float)rand()/(float)(RAND_MAX) ; 
        // first interaction 
        c = 2 * (float)rand() - 1 ; 
        phi = (float)rand()/(float)RAND_MAX; 
        x += -log(phi) * c/Tsigma; 
        while ((x < xmax) && (x > xmin)) 
         { 
          phi = (float)rand() /(float)RAND_MAX; 
          if (phi < 1/Tsigma) 
           { 
            count += 1 ; 
            break; 
           } 
          c = 2 * (float)rand() - 1 ; 
          phi = (float)rand() /(float)RAND_MAX; 
          x += (-log(phi)) * c/Tsigma; 
         } 
       } 
      num_abs[J] = count; 
      total_num_abs += num_abs[J];   
     } 
    double mean = (double)total_num_abs/(double)(numhistories * num_batch); 
    count = 0; 
    for (J = 0; J < num_batch; J++) 
     { 
      count += (num_abs[J] - numhistories * mean) * (num_abs[J] - numhistories *mean); 
     } 
    double variance = (double)count/(double)(num_batch * num_batch); 

    printf("mean = %f, variance = %f\n", mean , variance); 
    return 0; 
}  
+2

디버거에서 실행하여 어떤 현상이 일어나는지보십시오. –

+1

컴파일 된 모든 코드가 성공적으로 실행되면 우리의 작업은 ** 많이 ** 쉬울 것입니다. –

+0

@ AlgirdasPreidžius 아니에요. 종종 템플릿 메타 프로그래밍 (컴파일 타임에 문제를 해결!)을 사용하여이 작업을 수행 할 수 있지만 실제로는 그렇게하기가 쉽지 않습니다. ;) – Yakk

답변

2

프로그램이 끝날 때까지 인쇄되지 않고 충돌이 발생하지 않는 경우. 전에 나간다. 디버거를 연결하고 그것을 통해 단계 경우, 나는 여기에 빠져 결국 의심 것 :

num_abs = (char*) malloc (J+1); 
if (num_abs==NULL) exit (1); 

J는 초기화되지 않은 것으로 보인다 따라서 임의의 값이 될 수있다. 그리고 의견에 제시된 바와 같이, 경고 수준을 -Wall 또는 그와 비슷한 수준까지 올리십시오. 이러한 유형의 문제를 예방하는 데 도움이되는 경고가 있습니다.

어떤 이유로 든 사용할 수있는 디버거가없는 경우 문제가있는 위치의 범위를 좁히기 위해 여기에 더 많은 인화를 저장할 수 있습니다.

행운을 빈다.

+0

감사합니다. 그것은 불필요한 for 루프 중 하나였습니다. – Leon

+2

우수. 다행 이군. 모두 좋으면 내 대답을 받아주세요.) –

관련 문제