2011-07-10 15 views
0

確率的キューシステムのシミュレーションを作成しようとしています。問題は、ファイルを実行すると、update()を呼び出そうとするとすぐにセグメンテーションフォルトが発生することです。私は関数のコードがうまく動作するのでスタックの問題だと思ったが、C言語での経験はあまりないので、私もあなたの助けが必要だ。ここにコードです:関数呼び出しのセグメンテーションフォルト

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <math.h> 
#include <limits.h> 

#define MAXCLIENTS 11 
#define COUNTER_LIMIT 80000000 
#define MEAN_DIFFERENCE 0.0000001 

char servers_enabled;   
int state = 0;    
float p[MAXCLIENTS];    
float p_help_a[MAXCLIENTS]; 
float p_help_b[MAXCLIENTS];  
int arrivals = 0;    
int arrival_a[MAXCLIENTS];  
int arrival_b[MAXCLIENTS]; 
long int count = 0;    
float lambda[3]={0.5,1.0,1.5}; 
float mi_a = 2,mi_b = 0.5;  
float gamma_a = 0,gamma_b = 0,gamma_ratio=0; 
float p_b_ab,p_a,p_b,p_a_ab;    
double E = 0,lastE = 0.1;     

void arrive(char queue_enabled) {  
    ++arrivals; 
    switch (queue_enabled) { 
    case 'a' : 
     ++arrival_a[state]; 
     break; 
    case 'b' : 
     ++arrival_b[state]; 
     break; 
    } 
    ++count; 
    if (state<MAXCLIENTS) 
     ++state; 
} 

void depart() {  
    ++count; 
    --state; 
} 

float randomize() { 
    float result; 
    srand(time(NULL)); 
    result = (float) ((float)rand()/INT_MAX); 
    return result; 
} 

void update(FILE *input,FILE *output, FILE *helper) { 
    int i; 
    if (count%50000 == 0) { 
     gamma_a=0; 
     gamma_b=0; 
     for (i=0;i<MAXCLIENTS;i++) { 
      p_help_a[i] = (float) (arrival_a[i]/arrivals); 
      p_help_b[i] = (float) (arrival_b[i]/arrivals); 
      p[i] = p_help_a[i]+p_help_b[i]; 
      gamma_a += p[i]*mi_a; 
      gamma_b += p[i]*(arrival_b[i]/arrivals); 
      if (E != 0) 
       lastE = E; 
      E = 0; 
      E += i*p[i]; 
     } 
     gamma_a-=p_help_b[1]*mi_a-p_help_a[0]; 
     if (gamma_b != 0.0) 
      gamma_ratio = gamma_a/gamma_b; 
     fprintf(output,"throughput_a = %f | throughput_b = %f  | throughput ratio = %8.6f",gamma_a,gamma_b,gamma_ratio); 
     fprintf(output," | E = %f | Pli8os Gegonotwn = %ld\n",E,count); 
    } 
    //count++; 
    fprintf(input,"p_a[%2d] = %.10f p_b[%2d] = %.10f \n",i,p_help_a[i],i,p_help_b[i]); 
    fprintf(input,"p = %f \n",p[i]); 
    fprintf(helper,"gamma_a= %f gamma_b= %f gamma_ratio = %8.6f ",gamma_a,gamma_b,gamma_ratio); 
    fprintf(helper," E= %f  count= %ld \n",E,(count-1)); 
} 

int main() { 

    int i,j,k;  
    FILE *input,*output,*helper; 

    input=fopen("first.txt","w"); 
    output=fopen("second.txt","w"); 
    helper=fopen("third.txt","w"); 


    for (i=0;i<3;i++) { 
     fprintf(input,"Ruthmos Afiksewn (lambda) = %1.1f\n\n",lambda[i]); 
     fprintf(output,"Ruthmos Afiksewn (lambda) = %1.1f\n\n",lambda[i]); 
     fprintf(helper,"Ruthmos Afiksewn (lambda) = %1.1f\n\n",lambda[i]); 
     p_a=lambda[i]/(lambda[i]+mi_a);      p_a_ab=lambda[i]/(lambda[i]+mi_a+mi_b); 
     p_b=lambda[i]/(lambda[i]+mi_b);  
     p_b_ab=(lambda[i]+mi_a)/(lambda[i]+mi_a+mi_b); // ???? 
     for (j=1;j<=10;j++) {  
      fprintf(input,"--------------------------\n\n"); 
      fprintf(input,"Katofli (threshold) = %d\n\n",j); 
      fprintf(input,"--------------------------\n\n"); 
      fprintf(output,"--------------------------\n\n"); 
      fprintf(output,"Katofli (threshold) = %d\n\n",j); 
      fprintf(output,"--------------------------\n\n"); 
      fprintf(helper,"--------------------------\n\n"); 
      fprintf(helper,"Katofli (threshold) = %d\n\n",j); 
      fprintf(helper,"--------------------------\n\n"); 

      for (k=0;k<(MAXCLIENTS-1);k++) { 
       /******************/ 
      } 
      servers_enabled = 'a'; 
      while(count<=COUNTER_LIMIT && fabs(E-lastE)>=MEAN_DIFFERENCE) { 
       if (state == 0) { 
        arrive('a'); 
        update(input,output,helper); 
       } else 
       switch (servers_enabled) { 
        case 'a' : 
         if ((state <= j) && randomize() <= p_a) { 
          arrive('a'); 
          update(input,output,helper); 
         } else { 
          depart(); 
          update(input,output,helper); 
         } 
         if (state > j) 
          servers_enabled = 'b'; 
         break; 
        case 'b' : 
         if (state == 1) 
          if (randomize() < p_b) { 
           arrive('b'); 
           update(input,output,helper); 
          } else { 
           depart(); 
           update(input,output,helper); 
          } else if (randomize() < p_a) { 
           arrive('b'); 
           update(input,output,helper); 
          } else if (randomize() < p_b_ab) { 
           depart(); 
           update(input,output,helper); 
          } else { 
           depart(); 
           update(input,output,helper); 
           if (state <= j) 
            servers_enabled = 'a'; 
          } 
         break; 
       } 
      } 
     } 
    } 
    fclose(input); 
    fclose(output); 
    fclose(helper); 
    return 0; 
} 

残りのエラーは気にしないでください。私は現在、デバッグ段階にありますので、どんな助けでも大歓迎です。

+0

ようこそ、より具体的に(あなたはgdbか何かを試しましたか?)また、ここにたくさんのコードを入れて、私たちにあなたの人間ロジックコンパイラになるとは思わないでください。 –

+0

良いコードスタイルと字下げのための+1 :) – Ulterior

+1

はいそれを言及して申し訳ありません、私はそれをデバッグしようとしましたが、結果をもたらしませんでした。コードの簡略版を作成し、すぐに再転記します。早速のお返事ありがとうございます。 – rurzee

答えて

2

あなたの問題はラインである:ここでは

fprintf(input,"p_a[%2d] = %.10f p_b[%2d] = %.10f \n",i,p_help_a[i],i,p_help_b[i]); 

iは初期化されていないとp_help_a[i]は違反にアクセスするためにつながります。

+0

は問題ありません、 if(count%50000!= 0){} – Ulterior

+1

はい、それを修正しました:(i = 0; i rurzee

+0

@user。条件が真の 'count%50000 == 0'の場合にのみ重要です。実際には、コードをコピーして実行しようとしましたが、この例外があります。なぜこの世界で質問者がこのバグに遭遇していないのか分かりません:-) –

1
input=fopen("first.txt","w"); 
output=fopen("second.txt","w"); 
helper=fopen("third.txt","w"); 

nullの場合はどうなりますか?

関連する問題