[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: c programming question w/ ncurses



Fix below:

Keith wrote:

> I am trying to fumble through learning how to do some C programming.
> In the book I am using, Beginning Linux Programming they are now trying
> to use ncurses. I am getting the following errors when I try to compile
> my source. I am compiling with this command:
>
> $ cc -o screenmenu screenmenu.c -lncurses
>
> this is the error:
>
> screenmenu.c: In function `getchoice':
> screenmenu.c:72: warning: passing arg 3 of `tputs' from incompatible pointer type
>
> I get the same error when I compile the source from the book also. I also
> get it when I try and compile it on another Linux machine. I was just wondering
> if someone could look at the code and help me figure out why it is not working.
> It would be nice if just one person could write a book that has examples that
> work.
>
> Here is the source below:
> #include <stdio.h>
> #include <unistd.h>
> #include <termios.h>
> #include <term.h>
> #include <curses.h>
>
> static FILE *output_stream = (FILE *)0;
>
> char *menu[] = {
>     "a - add new record",
>     "d - delete record",
>     "q - quit",
>     NULL,
> };
>
> int getchoice(char *greet, char *choices[], FILE *in, FILE *out);
> int char_to_terminal(int char_to_write);
>
> int main()
> {
>     int choice = 0;
>     FILE *input;
>     FILE *output;
>     struct termios initial_settings, new_settings;
>
>     if (!isatty(fileno(stdout))) {
>         fprintf(stderr,"You are not a terminal, OK.\n");
>     }
>
>     input = fopen("/dev/tty", "r");
>     output = fopen("/dev/tty", "w");
>     if(!input || !output) {
>         fprintf(stderr, "Unable to open /dev/tty\n");
>         exit(1);
>     }
>
>     tcgetattr(fileno(input),&initial_settings);
>     new_settings = initial_settings;
>     new_settings.c_lflag &= ~ICANON;
>     new_settings.c_lflag &= ~ECHO;
>     new_settings.c_cc[VMIN] = 1;
>     new_settings.c_cc[VTIME] = 0;
>     new_settings.c_lflag &= ~ISIG;
>     if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {
>         fprintf(stderr,"could not set attributes\n");
>     }
>
>         choice = getchoice("Please select an action", menu, input, output);
>         printf("You have chosen: %c\n", choice);
>     } while (choice != 'q');
>     tcsetattr(fileno(input),TCSANOW,&initial_settings);
>     exit(0);
> }
>
> int getchoice(char *greet, char *choices[], FILE *in, FILE *out)
> {
>     do {
>         choice = getchoice("Please select an action", menu, input, output);
>         printf("You have chosen: %c\n", choice);
>     } while (choice != 'q');
>     tcsetattr(fileno(input),TCSANOW,&initial_settings);
>     exit(0);
> }
>
> int getchoice(char *greet, char *choices[], FILE *in, FILE *out)
> {
>     int chosen = 0;
>     int selected;
>     int screenrow, screencol = 10;
>
>     char **option;
>     char *cursor, *clear;
>
>     output_stream = out;
>
>     setupterm(NULL,fileno(out), (int *)0);
>     cursor = tigetstr("cup");
>     clear - tigetstr("clear");
>
>     screenrow = 4;
>     tputs(clear, 1, (int *) char_to_terminal);

tputs(clear, 1, char_to_terminal);

>     tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
>     fprintf(out, "Choice: %s", greet);
>     screenrow += 2;
>     option = choices;
>     while(*option) {
>         tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
>         fprintf(out, "%s\n",*option);
>         screenrow++;
>         option++;
>     }
>
>     do {
>         selected = fgetc(in);
>         option = choices;
>         while(*option) {
>             if(selected == *option[0]) {
>                 chosen = 1;
>                 break;
>             }
>             option++;
>         }
>         if(!chosen) {
>             tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);
>             fprintf(out, "Incorrect choice, select again\n");
>         }
>     } while(!chosen);
>     tputs(clear, 1, char_to_terminal);
>     return selected;
> }
>
> int char_to_terminal(int char_to_write)
> {
>     if (output_stream) putc(char_to_write, output_stream);
>     return 0;
> }
>
> ------------------------------------------------------------------
> end of code
> ------------------------------------------------------------------
>
> --
> Thanks,
> Keith
> MCNE
> ********************************************************************************
> Debian GNU/Linux                        http://www.naples.net/~nfn11988/linux
>
> --
> Unsubscribe?  mail -s unsubscribe debian-user-request@lists.debian.org < /dev/null



--
Jens B. Jorgensen
jjorgens@bdsinc.com



Reply to: