Segmentation fault on function call
I am trying to create a simulation of a stochastic queue system. The thing is that when running the file, I get a segmentation fault as soon as it tries to call update(). I figured it's a stack problem because the code in the function runs fine but since I am not very experienced with C I'd like your help too. Here is the code:
#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);
开发者_StackOverflow中文版 } 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;
}
Please don't mind the rest of the errors. I am currently in the debugging stage, so any help would be greatly appreciated, thanks.
Your problem is in line:
fprintf(input,"p_a[%2d] = %.10f p_b[%2d] = %.10f \n",i,p_help_a[i],i,p_help_b[i]);
Here i
is uninitialized and p_help_a[i]
leads to access violation.
input=fopen("first.txt","w");
output=fopen("second.txt","w");
helper=fopen("third.txt","w");
what if they are null?
精彩评论