title: how to properly use curses/debugging a simple c program
body: <p>I am trying to learn how to use curses to handle input for my upcoming assignment.
  i was given a c program called test-curses.c which contained the following code...</p>
  
  <pre><code>#include &lt;curses.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  
  // brief example of using curses.
  // man 3 ncurses for introductory man page, and man 3 function name
  // for more information on that function.
  
  void setup_curses();
  void unset_curses();
  
  int main()
  {
  
   setup_curses();
  
   move(5, 10);
   printw("Press any key to start.");
   refresh();
   int c = getch();
  
   nodelay(stdscr, true);
   erase();
  
   move(5, 10);
   printw("Press arrow keys, 'q' to quit.");
   refresh();
  
   c = getch();
  
   while(1)
   {
     if (c != ERR)
      {
    // in asn3, won't need to do any printing to screen.
    // instead, will rotate figure on left or right arrow keys, and
    // initiate thrust when space bar is pressed.
    erase();
    move(5,10);
    printw("Press arrow keys, 'q' to quit.");
    move(6, 10);
    if (c == KEY_DOWN)
      printw("down key pressed");
    else if (c == KEY_LEFT)
      printw("left key pressed");
    else if (c == KEY_RIGHT) 
      printw("right key pressed");
    else if (c == KEY_UP)
      printw("up key pressed");
    else if (c == 'q')
      break;
    refresh();
  
     }
  
     c = getch();
  
  }
  
  // must do this or else Terminal will be unusable
  // (if there are problems, it's not that big a deal though ... just
  // close the Terminal, and open a new one.)
  unset_curses();
  
  exit(EXIT_SUCCESS);
  }
  
  void setup_curses()
  {
    // use return values.  see man pages.  likely just useful for error
    // checking (NULL or non-NULL, at least for init_scr)
    initscr();
    cbreak();
    noecho();
    // needed for cursor keys (even though says keypad)
    keypad(stdscr, true);
  }
  
  void unset_curses()
  {
    keypad(stdscr, false);
    nodelay(stdscr, false);
    nocbreak();
    echo();
    endwin();
  }
  </code></pre>
  
  <p>i run this program by typing the following into the terminal
   gcc -std=c99 -Wall -o tester test-curses.c -lcurses
   ./tester</p>
  
  <p>and everything is fine and dandy. However when I modified the code to move a simple line drawing in sketchpad in response to the arrow keys I get major bugs. 
  here is my modified program.</p>
  
  <pre><code>#include &lt;curses.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;assert.h&gt;
  
  // brief example of using curses.
  // man 3 ncurses for introductory man page, and man 3 function name
  // for more information on that function.
  typedef struct {
    long x, y, x1, y1;
    long deltax, deltay, deltax1, deltay1;
   } line_item;
  
  line_item *line;
  FILE * popen(const char*, const char*);
  int pclose(FILE*);
  void setup_curses();
  void unset_curses();
  void draw(line_item * line, FILE * executable);
  void translate(line_item * line, double trans_x, double trans_y);
  
  int main()
  {
    FILE * executable;
    executable = popen("java -jar Sketchpad.jar", "w");
    assert( executable != NULL);
  
    setup_curses();
  
    move(5, 10);
    printw("Press any key to start.");
    refresh();
    int c = getch();
  
    nodelay(stdscr, true);
    erase();
  
    move(5, 10);
    printw("Press arrow keys, 'q' to quit.");
    refresh();
  
    c = getch();
  
    while(1)
    {
      if (c != ERR)
      {
        // in asn3, won't need to do any printing to screen.
        // instead, will rotate figure on left or right arrow keys, and
        // initiate thrust when space bar is pressed.
        erase();
        move(5,10);
        printw("Press arrow keys, 'q' to quit.");
        move(6, 10);
        if (c == KEY_DOWN){
          printw("down key pressed");
          translate(line, 0, -10);
          draw(line, executable);
        }
        else if (c == KEY_LEFT){
          printw("left key pressed");
          translate(line, -10, 0);
          draw(line, executable);
        }
        else if (c == KEY_RIGHT){ 
          printw("right key pressed");
          translate(line, 10, 0); 
          draw(line, executable); 
        }
        else if (c == KEY_UP){
          printw("up key pressed");
          translate(line, 10, 0); 
          draw(line, executable); 
        }
        else if (c == 'q')
          break;
        refresh();
  
      } 
  
      c = getch();
      pclose(executable);
    }
  
    // must do this or else Terminal will be unusable
    // (if there are problems, it's not that big a deal though ... just
    // close the Terminal, and open a new one.)
    unset_curses();
  
    exit(EXIT_SUCCESS);
  }
  
  void draw(line_item * line, FILE * executable)
  {
    fprintf(executable, "eraseSegment %ld %ld %ld %ld", line-&gt;x, line-&gt;y, line-&gt;x1, line-&gt;y1);
    fprintf(executable, "drawSegment %ld %ld %ld %ld", line-&gt;deltax, line-&gt;deltay, line-&gt;deltax1, line-&gt;deltay1);
    fflush(executable);
  }
  void translate(line_item * line, double trans_x, double trans_y)
  {
    line-&gt;x = line-&gt;deltax;
    line-&gt;y = line-&gt;deltay;
    line-&gt;x1 = line-&gt;deltax1;
    line-&gt;y1 = line-&gt;deltay1;
  
    line-&gt;deltax = line-&gt;x + trans_x;
    line-&gt;deltax1 = line-&gt;x1 + trans_x;
    line-&gt;deltay = line-&gt;y + trans_y;
    line-&gt;deltay1 = line-&gt;y1 + trans_y;
  }
  
  void setup_curses()
  {
    // use return values.  see man pages.  likely just useful for error
    // checking (NULL or non-NULL, at least for init_scr)
    initscr();
    cbreak();
    noecho();
    // needed for cursor keys (even though says keypad)
    keypad(stdscr, true);
  }
  
  void unset_curses()
  {
    keypad(stdscr, false);
    nodelay(stdscr, false);
    nocbreak();
    echo();
    endwin();
  }
  </code></pre>
  
  <p>the current directory holds these two programs and Sketchpad.jar. the error I get when I run the second one looks like this....</p>
  
  <pre><code>ses.so.5.9
            7f100a23a000-7f100a23b000 r--p 0001f000 08:01 2882225                    /lib/x86_64-linux-gnu/libncurses.so.5.9
            7f100a23b000-7f100a23c000 rw-p 00020000 08:01 2882225                    /lib/x86_64-linux-gnu/libncurses.so.5.9
            7f100a23c000-7f100a25e000 r-xp 00000000 08:01 2877975                    /lib/x86_64-linux-gnu/ld-2.15.so
            7f100a428000-7f100a42c000 rw-p 00000000 00:00 0 
            7f100a45b000-7f100a45e000 rw-p 00000000 00:00 0 
            7f100a45e000-7f100a45f000 r--p 00022000 08:01 2877975                    /lib/x86_64-linux-gnu/ld-2.15.so
            7f100a45f000-7f100a461000 rw-p 00023000 08:01 2877975                    /lib/x86_64-linux-gnu/ld-2.15.so
            7ffffa0be000-7ffffa0df000 rw-p 00000000 00:00 0                          [stack]
           7ffffa19e000-7ffffa19f000 r-xp 00000000 00:00 0                          [vdso]
      ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
         Aborted (core dumped)
  </code></pre>
  
  <p>i do not understand what this is telling me, and what difference between the files has caused this mess. please help.</p>
  
  <p>I should tell you something about the following commands sent to sketchpad
  drawSegment x y x1 y1 draws a line from (x,y) -> (x1, y1) in sketchpad window 
  eraseSegment x y x1 y1 erases that line.</p>