rodney@dali.ipl.rpi.edu (Rodney Peck II) (12/01/89)
Help!
I think I unwittingly found a program (maybe a typo?) in the argument passing
in g++. Here's what happens...(I've got a conditional bkpt to catch the problem
here)
Starting program: /home/rodney/courses/paradigm/bank/main
Bpt 1, enqueue_PSbqueue_PScitizen ($this=(struct bqueue *) 0x140ac, patron=(struct citizen *) 0x14) (bqueue.cc line 76)
(gdb) up
Reading in symbols for citizen.cc...done.
#1 0x2788 in enter_bank_PScitizen ($this=(struct citizen *) 0x15ed8) (citizen.cc line 71)
(gdb) print this
$1 = (struct citizen *) 0x15ed8
(gdb) down
#0 enqueue_PSbqueue_PScitizen ($this=(struct bqueue *) 0x140ac, patron=(struct citizen *) 0x14) (bqueue.cc line 76)
(gdb) print patron
$2 = (struct citizen *) 0x14
(gdb) print $i1
$3 = 89816
(gdb) print/x $i1
$4 = 0x00015ed8
(gdb) print/x $l1
$5 = 0x00000014
(gdb)
---
portion of program...
bqueue.cc which is the code for bqueue::enqueue
void bqueue::enqueue(citizen *patron)
{
=>if (head == 0) tail = 0;
for(node *P=tail;1;P=P->prev) {
if ((P==0) || !condition((void *)patron,(void *)P->info))
break;
}
insert_before(P,new node(patron));
tickle_queue();
}
The breakpoint is where the arrow is pointing above.
void citizen::enter_bank() {
if (type <= KNIGHT) schedule_entrance();
// get in line
entrance_time = Events.time; // set the time this one came in to now
// now, get in line. The queue will alert the teller that I'm here
=>entrance.enqueue(this);
}
The part of citizen.cc which calls bqueue::enqueue. Again, the arrow points
to the part in question.
As you can see from the prints and backtraces, when in enter_bank, `this' has
a proper value and should be passed to entrance.enqueue properly. In enqueue,
however, it actually gets a 0x14. This corresponds to register $i1 but
register $l1 has the actual value that should have been passed. In fact, if
I put a conditional breakpoint in there and have it assign $l1 to $i1 and
continue, everything works fine. Oddly, this problem doesn't always appear.
Sometimes, to make things worse, the program executes perfectly, but not often.
HELP!!!
Here's the version info:
dali.ipl.rpi.edu% g++ -v
g++ version 1.35.1-
dali.ipl.rpi.edu% gcc -v
gcc version 1.36
dali.ipl.rpi.edu%
Please reply quickly if you have any idea what is happening, this project is
due tomorrow!
--
Rodney