2017-02-07 14 views
1

以下のファイルはコンパイルされますが実行されません。C++ファイルは実行されませんが、コンパイルされます

カーソルが数回点滅してから停止します。何が問題なのか分からない?

run 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

ありがとう!それは、それと不要なループの1つでした。 – Leon

+2

優れています。あなたがそれを見つけてうれしいです。すべてが良い場合は、私の答えを受け入れてください;) –

関連する問題