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

Reply via email to