I'm stumped debugging a problem in a C self-study course. A "while" expression
is hung in a loop without progressing to the body the "while" is supposed to
execute. It seems to me this should not be possible. Can anyone see what's
going on?
Here is the affected code snippet:
else { //token is an operator
while (stack_anchor != NULL) { // operators on stack
while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
ptoken2 = pop(ptop);
printf("Debug: Enqueue operator-precedences to postfix queue
\n");
enqueue(&queue_postfix,ptoken2);
} // end "pop operators off stack
} // end "operators on stack"
push(ptop,ptoken); // push new operator onto stack
} // end "token is an operator"
The second "while" is line 298. When I single-step with GDB, line 298 repeats
indefinitely. If instead of single-stepping, I just let the program run, the
printf is never executed.
Here is the gdb output:
298 while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
(gdb) n
298 while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
(gdb) n
298 while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
(gdb) n
298 while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
(gdb) n
298 while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
(gdb) n
298 while ((op_precedences[stack_anchor->value.op_code] >
op_precedences[ptoken->value.op_code]) || ((op_precedences[stack_anchor-
>value.op_code] == op_precedences[ptoken->value.op_code]) &&
(op_associativity[op_precedences[stack_anchor->value.op_code]] == LEFT))) {
_______________________________________________
Mid-Hudson Valley Linux Users Group http://mhvlug.org
http://mhvlug.org/cgi-bin/mailman/listinfo/mhvlug
Upcoming Meetings (6pm - 8pm) Vassar College
Nov 7 - Typography: Physical Art to Digital Art
Dec 5 - Sysadmin Panel