Thread View: gnu.g++.bug
1 messages
1 total messages
Started by David W. Forslund
Mon, 16 Oct 1989 21:24
RE: g++1.36.0-
Author: David W. Forslund
Date: Mon, 16 Oct 1989 21:24
Date: Mon, 16 Oct 1989 21:24
470 lines
13670 bytes
13670 bytes
G++1.36.0 fails to compile the following code on a Sun3 running
OS4.0.3. It compiles fine on a Sun4 running OS4.0.3.
bank1.C:
--------------------
// Main bank simulation program
// This program simulates a bank with one waiting line
// and n servers. When one or more servers is free,
// the server is chosen randomly
// File bank1.c
#include "queue.h"
#include "server.h"
extern random2(int,int);
extern "C" double drand48();
float average_iat; // Average interarraival time
float simulation_time; // Time, in minutes, bank is open
int number_servers; // Number of servers in system
float *average_service_time; // Array of av_serv_times
float arrival_time;
//Object declarations
customer_queue q;
time t;
server *s; //Array of servers
void get_input()
{
printf("\nEnter the number of servers:");
scanf("%d",&number_servers);
average_service_time = new float[number_servers];
s = new server[number_servers];
for (int z=0 ; z<number_servers ; z++)
{
printf("\nEnter average service time for server %d:", z+1);
scanf("%f",&average_service_time[z]);
s[z].set_av_service_time(average_service_time[z]);
}
printf("\nEnter the average interarrival time:");
scanf("%f",&average_iat);
printf("\nNumber of minutes for the simulation:");
scanf("%f",&simulation_time);
printf("\n");
}
main()
{
extern int get_next_event(float &n_event_time);
extern int server_avail(int &n);
extern void report_stats(customer_queue q);
extern void title();
extern float generate_iat(time t);
float next_event_time;
int next_event;
int server_no;
get_input();
title();
printf("Simulating...\n");
arrival_time= generate_iat(t);
do
{
//During business hours...
//Determine the next event
next_event = get_next_event(next_event_time);
#ifdef debug
printf("\nThe next event = %d",next_event);
printf("next_event_time|%f",next_event_time);
#endif
if(next_event_time <= simulation_time)
{
t.set_time(next_event_time);
if(next_event > 0 && q.size() > 0)
{ //Take a customer from the queue
q.remove(t);
s[next_event -1].serve_cust(t);
#ifdef debug
printf("\nThe queue size = %d\n\n",q.size());
#endif
}
else if (next_event> 0 && q.size() == 0)
{
s[next_event -1].set_server_free();
#ifdef debug
printf("\nThe queue size = %d\n\n",q.size();
#endif
}
else //Next event is a customer arrival
{
if (q.size() == 0 && server_avail(server_no))
{ // Customer goes directly to server server_no
q.insert(t);
q.remove(t); // Insert and remove to update stats
s[server_no].serve_cust(t);
#ifdef debug
printf("\nThe queue size = %d\n\n",q.size());
#endif
}
else //customer joins queue
{
q.insert(t);
#ifdef debug
printf("\nThe queue size = %d\n\n",q.size());
#endif
}
arrival_time = generate_iat(t);
}
}
} while (next_event_time <= simulation_time);
arrival_time = large; //Bank is now closed
next_event = get_next_event(next_event_time);
#ifdef debug
printf("\nBank closed\n");
printf("\nThe next_event = %d", next_event);
printf("\nnext_event_time = %f",next_event_time);
printf("\nCurrent queue size = %d",q.size());
#endif
// Determine wither all servers are free
while (next_event !=0)
{
t.set_time(next_event_time);
if (q.size() > 0)
{
q.remove(t);
s[next_event -1].serve_cust(t);
}
else
s[next_event-1].set_server_free();
next_event = get_next_event(next_event_time);
}
report_stats(q);
}
float generate_iat(time t)
{ //Exponential distribution with mean given by av_
// interarrival_time
return(-average_iat *log(rand_real() ) + t.get_time());
}
int get_next_event(float&n_event_time)
{
float min = arrival_time;
int choice = 0;
float temp;
for (int i=1;i<=number_servers; i++)
{
if (( temp=s[i-1].get_next_available())<min)
{
choice =i;
min =temp;
}
}
n_event_time = min;
return choice;
}
int server_avail(int &n)
{
// Returns 0 if no server is available
// otherwise returns 1 and number of available server
int choice[30];
int number_free = 0;
for (int i = 0; i<number_servers;i++)
{
if (!s[i].busy())
{
choice[number_free] = i;
number_free++;
}
}
if (number_free == 0 )
return 0;
else
{
// Choose a random server among available servers
n = choice[random2(0,number_free-1)];
return 1;
}
}
void report_stats(customer_queue q)
{
printf("\nOutput Statistics");
printf("\n--------------------");
printf("\n\nAverage queue size :%-8.3f",
q.average_queue_size(t));
printf("\n\nAverage queue wait time :%-8.3f",
q.average_queue_wait_time());
printf("\n\nMaximum queue size :%-d",q.maximum_queue_size());
printf("\n\nTotal customers :%-d",q.total_customers());
for (int i = 0; i<number_servers;i++)
{
printf("\n\nServer %d service time: %-8.3f%c",
i+1,s[i].fraction_of_time_service(t) *100,37);
printf("\n\nServer %d total served: %-d\n",i+1,s[i].get_total_served());
}
}
void title()
{
printf("Discrete Event Simulation of Bank Queue");
printf("\n-------------------------------------------\n");
}
int random2(int first,int number)
{
return(first + (int) (drand48()*number));
}
queue.h:
----------------------
// Interface to dynamic queue class
// This queue is derived from a generic list class
// There is no limitation on the queue size except the size
// of the heap
// file queue.h
#include "list.h"
#include "time.h"
#include "cust.h"
class queue: slist
// A private derived class to serve only class customer_queue
{
friend class customer_queue;
// The operations of put and get are accessible only
// by the friend class customer queue.
private:
void put(customer *c) {slist::append((char*)c);}
customer *get() {return (customer *)slist::get();}
public:
queue(): (sizeof(customer)){}
};
class customer_queue
{
private:
queue q; // A private queue derived from a generic list
float last_event_time; //Time of last customer
// arrival or departure
int cum_customers; // Cumulative number of customers
int current_queue_size;
int peak_queue;
float cum_queue_size_time; // cumulative sum of products
// of size of queue x time
float cum_wait_time; // Cumulative wait time for
// all patrons
public:
void insert(time t);
void remove(time t);
customer_queue();
int total_customers(){return cum_customers;}
float average_queue_size(time t)
{
return (cum_queue_size_time / t.get_time());
}
int size() {return current_queue_size;}
int maximum_queue_size() { return peak_queue;}
float average_queue_wait_time()
{
return (cum_wait_time / cum_customers);
}
float total_wait_time() { return cum_wait_time;}
};
list.h:
----------------------------------
// This code defines a class for a singly linked list.
// File list.h
#include <stdio.h>
class node
{
friend class slist;
private:
node* next;
char* contents; // contents dynamically allocated
};
class slist
{
private:
node* head; // Head of list
int size; // Number of bytes for contents
public:
slist(int s) { head=0; size=s;}
void insert(char* a); // Add to the head of the list.
void append(char *a); // Add to the tail of the list.
char *get(); // Remove the head of the list.
void clear(); // Remove all the nodes in list.
~slist(){ clear();}
};
cust.h:
---------------------------------
// Interface to clas customer
//File cust.h
class customer
{
friend class customer_queue;
private:
float arrival_time; // time when customer joins line
};
time.h:
------------------------------
// Interace to class time
// File ltime.h
class time
{
private:
float current_time;
public:
time()
{
current_time=0.0;
}
float get_time() { return current_time;}
void set_time(float t) {current_time = t;}
};
server.h:
------------------------------------
// Interface for class server
// File server.h
#include <stdio.h>
#include <math.h>
const float large = 999999.9;
extern float rand_real();
extern "C" double drand48();
class server
{
private:
int available; // 1 if server is free, otherwise 0
float cum_service_time; // Cumulative service time
float next_available; // time when server is free
int total_customers_served;
float av_service_time;
public:
server()
{
cum_service_time = 0.0;
total_customers_served = 0;
next_available = large;
available = 1;
}
void add_to_total_served() { total_customers_served++;}
void set_server_free()
{
available = 1;
next_available = large;
}
void set_server_busy() { available = 0;}
int busy()
{
if(available)
return 0;
else
return 1;
}
int get_total_served() {return total_customers_served;}
void add_to_service_time (float t)
{
cum_service_time += t;
}
float fraction_of_time_service(time t)
{
return(cum_service_time/ (t.get_time()));
}
void set_next_available(float t) {next_available = t;}
float get_next_available() {return next_available;}
void serve_cust(time t)
{
float r = -av_service_time * log(rand_real());
set_next_available(t.get_time() + r);
add_to_service_time(r);
add_to_total_served();
set_server_busy();
}
void set_av_service_time(float average_service_time)
{
av_service_time = average_service_time;
}
};
float rand_real()
{
return(drand48());
}
This code, of course, is from Wiener and Pinson's book.
Script started on Mon Oct 16 15:13:07 1989
gcc -v -c -satchmo% g bank1.C
gcc version 1.36
gcc: bank1.C: linker input file unused since linking not done
satchmo% g++ -v -c -g bank1.C
gcc version 1.36.0- (based on GCC 1.36)
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 bank1.C /usr/tmp/cca29787.cpp
GNU CPP version 1.36
/usr/local/lib/gcc-cc1plus /usr/tmp/cca29787.cpp -quiet -dumpbase bank1.C -g -version -o /usr/tmp/cca29787.s
GNU C++ version 1.36.0- (based on GCC 1.36) (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
In file included from /usr/local/lib/g++-include/errno.h:12, from /usr/local/lib/g++-include/math-68881.h:23, from /usr/local/lib/g++-include/math.h:33, from server.h:6, from bank1.C:8:
/usr/local/lib/g++-include/std.h:198: warning: type declaration of time shadowed
In file included from bank1.C:8:
server.h:50: parse error before `t'
server.h:58: parse error before `t'
server.h: In method float server::fraction_of_time_service (...):
server.h:52: `t' undeclared (first use this function)
server.h:52: (Each undeclared identifier is reported only once
server.h:52: for each function it appears in.)
server.h:51: warning: varargs function cannot be inline
server.h: In method void server::serve_cust (...):
server.h:61: `t' undeclared (first use this function)
server.h:59: warning: varargs function cannot be inline
bank1.C: At top level:
bank1.C:21: parse error before `t'
bank1.C:21: `t' used prior to declaration
bank1.C:21: warning: data definition lacks type or storage class
bank1.C: In function int main ():
bank1.C:50: parse error before `t'
bank1.C:71: object in '.' expression is not of aggregate type
bank1.C:74: bad argument 0 for function `customer_queue::remove (class time)' (type was int )
bank1.C:91: bad argument 0 for function `customer_queue::insert (class time)' (type was int )
bank1.C:92: bad argument 0 for function `customer_queue::remove (class time)' (type was int )
bank1.C:100: bad argument 0 for function `customer_queue::insert (class time)' (type was int )
bank1.C:120: object in '.' expression is not of aggregate type
bank1.C:123: bad argument 0 for function `customer_queue::remove (class time)' (type was int )
bank1.C: At top level:
bank1.C:132: parse error before `t'
bank1.C: In function float generate_iat (...):
bank1.C:135: object in '.' expression is not of aggregate type
bank1.C: In function void report_stats (class customer_queue):
bank1.C:186: bad argument 0 for function `customer_queue::average_queue_size (class time)' (type was int )
Note that it does compile with Cfront 2.0 (as well as g++ 1.36.0- on Sparc)
satchmo% CC -g -c bank1.C
CC +g bank1.C:
"./queue.h", line 13: warning: base slist private by default: please be explicit ``: private slist
cc -c -I/usr/local/CC/sun3/incl -g bank1.c
satchmo% ^D
script done on Mon Oct 16 15:13:46 1989
David Forslund
MS E531
Los Alamos National Laboratory
Los Alamos, NM 87545
(505) 665-1907
(dwf@lanl.gov)
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads