Thread View: gnu.g++.bug
1 messages
1 total messages
Started by David W. Forslund
Wed, 18 Oct 1989 19:19
Re: G++1.36.0- bugs
Author: David W. Forslund
Date: Wed, 18 Oct 1989 19:19
Date: Wed, 18 Oct 1989 19:19
480 lines
12029 bytes
12029 bytes
I found the following problem with the 10/17/89 version of g++.xtar on
labrea.stanford.edu running on a 3/470 and OS4.0.3:
Script started on Wed Oct 18 13:10:40 1989
satchmo% make
g++ -c -g bank1.C
bank1.C: In function int main ():
bank1.C:131: The following insn was not recognizable:
(insn 126 125 127 (set (reg:SI 78)
(mem:SF (plus:SI (reg:SI 14)
(const_int -20)))) -1 (nil)
(nil))
g++: Program cc1plus got fatal signal 6.
*** Error code 1
make: Fatal error: Command failed for target `bank1.o'
satchmo% ^D
script done on Wed Oct 18 13:11:04 1989
Here is the code:
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# cust.h
# list.h
# queue.h
# server.h
# time.h
# bank1.C
# This archive created: Wed Oct 18 13:11:34 1989
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'cust.h'
then
echo shar: "will not over-write existing file 'cust.h'"
else
cat << \SHAR_EOF > 'cust.h'
// Interface to clas customer
//File cust.h
class customer
{
friend class customer_queue;
private:
float arrival_time; // time when customer joins line
};
SHAR_EOF
fi
if test -f 'list.h'
then
echo shar: "will not over-write existing file 'list.h'"
else
cat << \SHAR_EOF > '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();}
};
SHAR_EOF
fi
if test -f 'queue.h'
then
echo shar: "will not over-write existing file 'queue.h'"
else
cat << \SHAR_EOF > '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(mytime t);
void remove(mytime t);
customer_queue();
int total_customers(){return cum_customers;}
float average_queue_size(mytime 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;}
};
SHAR_EOF
fi
if test -f 'server.h'
then
echo shar: "will not over-write existing file 'server.h'"
else
cat << \SHAR_EOF > '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 (mytime 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(mytime 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());
}
SHAR_EOF
fi
if test -f 'time.h'
then
echo shar: "will not over-write existing file 'time.h'"
else
cat << \SHAR_EOF > 'time.h'
// Interace to class time
// File ltime.h
#ifndef TIME_H
#define TIME_H
class mytime
{
private:
float current_time;
public:
mytime()
{
current_time=0.0;
};
float get_time() { return current_time;};
void set_time(float t) {current_time = t;};
};
#endif TIME_H
SHAR_EOF
fi
if test -f 'bank1.C'
then
echo shar: "will not over-write existing file 'bank1.C'"
else
cat << \SHAR_EOF > '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;
mytime 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(mytime 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));
}
SHAR_EOF
fi
exit 0
# End of shell archive
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