Logic errors

Now let's talk about logic errors. These can be very hard to diagnose, and unfortunately I don't have any magical ways to avoid those. There are some things that can be pointed out however to help track them down.

A common problem with coding is what is called off by 1 errors. This was caused when computer language designers in the sixties decided to number things starting at 0 instead of 1. Computers will happily start counting anywhere you want them to and never complain at all, but most humans tend to do better when they start counting at 1. Most of my peers would probably disagree with this, but since I was the one who always had to fix their off by 1 defects I stand by my comments.

Let's look at the following very simple script:

Chapter 9 - Script 4

#!/bin/sh
#
# 6/7/2017
#
echo "Chapter 9 - Script 4"

x=0
while [ $x -lt 5 ]
do
 echo "x: $x"
 let x++
done

echo "x after loop: $x"
let maxx=x

y=1
while [ $y -le 5 ]
do
 echo "y: $y"
 let y++
done

echo "y after loop: $y"
let maxy=y-1                 # must subtract 1

echo "Max. number of x: $maxx"
echo "Max. number of y: $maxy"

echo "End of script4"
exit 0

And the output:

Chapter 9 - Script 4

Look at the subtle differences between the two loops:

  • In the x loop the counting was started at 0.
  • x was incremented while it was less than 5.
  • The value of x after the loop was 5.
  • The var maxx, which is supposed to equal the number of iterations, is set to x.
  • In the y loop the counting was started at 1.
  • y was incremented while it was less than or equal to 5.
  • The value of y after the loop was 6.
  • The var maxy, which is supposed to equal the number of iterations, is set to y-1.

If you already understand the above perfectly you will probably never have a problem with 1 off errors and that's great.

For the rest of us I suggest looking over this very carefully until you get it just right.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.227.114.125