# Runtime problem

• 10-12-2010
SantoshN
[SOLVED] Runtime problem
Hi All,
I have written a piece of code (simulated Annealing) whose outline is as follows:
Code:

``` 97  while(temp > 0.3 * TEMP) {  98    while (j < 20) {  99      printf("Calculating a new solution:\t"); 100      srand((unsigned) time(NULL)); 101      newSoln = neighbour(oldSoln); 102      printf("%d: Calling the cost fn\t", j); 103      newCost = cost(newSoln); 104      deltaCost = newCost - oldCost; 105      tempRn = rand(); 106      printf("rand num: %d\t", (int) tempRn); 107      rn = 1 / (double)tempRn; 108      deltaFn = exp( -((double)deltaCost/temp)); 109      if ((deltaCost < 0) || (rn < deltaFn)) { 110        printf ("Accepting (%d) %d %f %f\t", newCost, deltaCost, rn, deltaFn); 111        oldSoln = newSoln; 112        oldCost = newCost; 113      } 114      j++; 115      printf("%d: Done with the cost fn\t", j); 116      printf("Hi\n"); 117    } 118    printf("Hi Again\n"); 119  }```
The inner loop is expected to run 20 times for each outer loop iteration. What I am observing is this is not so. During run time, "Hi" from line 116 is being printed but neither "Hi again" from line 118 or "Calculating ....." from line 99 are printed. I have ensured that the loop conditions are still true. It just hangs for example the below is the output
Quote:

Calculating a new solution: 0: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 1: Done with the cost fn Hi
Calculating a new solution: 1: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 2: Done with the cost fn Hi
Calculating a new solution: 2: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 3: Done with the cost fn Hi
Calculating a new solution: 3: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 4: Done with the cost fn Hi
Calculating a new solution: 4: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 5: Done with the cost fn Hi
Calculating a new solution: 5: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 6: Done with the cost fn Hi
Calculating a new solution: 6: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 7: Done with the cost fn Hi
Calculating a new solution: 7: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 8: Done with the cost fn Hi
Calculating a new solution: 8: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 9: Done with the cost fn Hi
Calculating a new solution: 9: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 10: Done with the cost fn Hi
Calculating a new solution: 10: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 11: Done with the cost fn Hi
Calculating a new solution: 11: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 12: Done with the cost fn Hi
Calculating a new solution: 12: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 13: Done with the cost fn Hi
Calculating a new solution: 13: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 14: Done with the cost fn Hi
Calculating a new solution: 14: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 15: Done with the cost fn Hi
Calculating a new solution: 15: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 16: Done with the cost fn Hi
Calculating a new solution: 16: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 17: Done with the cost fn Hi
Calculating a new solution: 17: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 18: Done with the cost fn Hi
Calculating a new solution: 18: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 19: Done with the cost fn Hi
Calculating a new solution: 19: Calling the cost fn rand num: 5208 Accepting (97) 0 0.000192 1.000000 20: Done with the cost fn Hi
Hi Again
The cost after swapping is 97. The temperature is 1.350851
Partition A: 7 11 17 15 10 12 14 16 18 20
Partition B: 1 8 3 6 4 9 13 5 2 19
Next Iteration:
Calculating a new solution: 0: Calling the cost fn rand num: 9511 Accepting (97) 0 0.000105 1.000000 1: Done with the cost fn Hi
Calculating a new solution: 1: Calling the cost fn rand num: 10872 Accepting (95) -2 0.000092 4.395353 2: Done with the cost fn Hi
Calculating a new solution: 2: Calling the cost fn rand num: 13196 Accepting (95) 0 0.000076 1.000000 3: Done with the cost fn Hi

<HANG!!!!>
Very clearly as the value of j which is 3 here is less that 20, should it go to top of the loop and continue, but it doesnot. It is stuck there forever and I need to kill the a.out. The j value where it hangs is random. I am not able to figure out the cause of the hang.
Also note that the function cost (line 103) opens and closes a file, uses malloc for storing 200 arrays (of 10 integers each) everytime it is called.Many of you might frown at this, but I have just begun writing C programs and so there is very little planning that went into this script. I have used free() to free the malloc'd memory. So that should ease some nerves.

Any ideas why these random hangs are occuring.? I have observed that CPU is running at 100% during these hangs. So I know something is fishy but not what.

If any of you has waded thorough this long post I am sincerely thankful and would be glad to get any ideas/hints/suggestion or best solutions.

Thanks a ton
Santosh
• 10-12-2010
Salem
> srand((unsigned) time(NULL));
time() is a CONSTANT in a short-lived program loop. Every call to rand() is going to return the same number.
Call srand() ONCE at the start of main.

Since you seem to be on a Unix/Linux platform, run the code in the debugger.
gdb ./a.out
run

When it seems to hang, just press ctrl-c and then use the 'bt' command to show you exactly where it has stopped.

You need to post your code that contains the malloc/free code. This is a frequent area for problems.
• 10-12-2010
SantoshN
[Solved] Runtime problem
Hi Salem,

Thanks for the suggestions. Let me first mention that I managed to debug the problem. I was using lfind() to search for an element in an array (function call: neighbour) and it was behaving nastily for some strange reason. I then replace it with a traditional loop to search and now it runs smooth.
The biggest cause of my inability to debug was:
Code:

`printf("Some string\t");`
printf doesnot print till it encounters '\n' I was unaware of this and was adding printf statements with '\t' to debug. None of them were printed. So I was stuck. Once I realised this. it was a piece of cake.

I am novice at gdb. Will have to learn it one of these days.

Thanks
Santosh