undefined reference to gotoxy in C

匿名 (未验证) 提交于 2019-12-03 09:05:37

问题:

I am trying to write a program in C language(code::blocks in windows). I have added below header files, it compiles with no error, but when it comes to run the code it throws an error undefined reference to gotoxy. Find the full code. Error comes where ever I have gotoxy statements.

# include # include # include # include # include #include struct node {  int data;     struct node *link; }; void append(struct node **,int); void in_begin(struct node **,int); void del(struct node **,int); void in_middle(struct node **,int,int); int count(struct node *); void display(struct node *); char ans; int main() {   struct node *p;  /* p can be said as the head or a start ptr */      p=NULL;      /* Printing the menu */      int num,loc;      char choice;      do      { //clrscr();         printf("PROGRAM TO IMPLEMENT SINGLY LINKED LIST ");         printf("\n=====================================");         printf("\n\n1.Create \\ Appending The List");         printf("\n2.Insert Node At Begining");         printf("\n3.Insert Node In Middle");         printf("\n4.Deleting a  Node");         printf("\n5.Counting The No Of Nodes");         printf("\n6.Displaying the list");         printf("\n7.Exit");         oper:         gotoxy(1,15);printf("                                          ");         gotoxy(1,11);printf("\n\nEnter ur Choice : ");         choice=getch();         switch(choice)         {             case '1':             //  char ans;               do              {  printf("Enter any number : ");                  scanf("%d",&num);                  append(&p,num);                  printf("Enter more (y/n) :");                  fflush(stdin);                  ans=getchar();               }while(ans !='n');              break;              case '2':              printf("Enter The Data : ");              scanf("%d",&num);              in_begin(&p,num);              break;               case '3':              printf("\nEnter The Position :");              scanf("%d",&loc);              printf("\nEnter The Data : ");              scanf("%d",&num);              in_middle(&p,loc,num);              break;               case '4':              printf("\nEnter The Data u Want To Delete : ");              scanf("%d",&num);              del(&p,num);              break;               case '5':              printf("\nThe No Of Nodes Are %d",count(p));              getch();              break;               case '6':              display(p);              getch();              break;               case '7':              printf("\n\nQuiting.......");              getch();              exit(0);              break;               default:              gotoxy(1,15);printf("Invalid choice.Please Enter Correct Choice");              getch();              goto oper;          }       }while(choice !=7); return 0; }  void append(struct node **q,int num) {   struct node *temp,*r;      temp = *q;      if(*q==NULL)      {   temp = (struct node *)malloc(sizeof(struct node));           temp->data=num;           temp->link=NULL;           *q=temp;      }      else      {  temp = *q;          while(temp->link !=NULL)          {  temp=temp->link;          }          r = (struct node *)malloc(sizeof(struct node));          r->data=num;          r->link=NULL;          temp->link=r;      } }  void display(struct node *q) {     if(q==NULL)         {  printf("\n\nEmpty Link List.Can't Display The Data");             getch();             goto last;         }       while(q!=NULL)         {  printf("\n%d",q->data);             q=q->link;         }      last:      ; }  int count(struct node *q) {  int c=0;     if(q==NULL)     { printf("Empty Link List.\n");       getch();       goto last;     }     while(q!=NULL)     {   c++;          q=q->link;     }     last:     return c;  }  void in_begin(struct node **q,int num) {  struct node *temp;     if(*q==NULL)     {  printf("Link List Is Empty.Can't Insert.");         getch();         goto last;     }     else     {   temp=(struct node *)malloc(sizeof(struct node));          temp->data=num;          temp->link=*q;          *q=temp;  /* pointing to the first node */      }      last:      getch(); }  void in_middle(struct node **q,int loc,int num) {  struct node *temp,*n;     int c=1,flag=0;     temp=*q;     if(*q==NULL)     {  printf("\n\nLink List Is Empty.Can't Insert.");         getch();         goto last;     }     else     while(temp!=NULL)     {  if(c==loc)         {  n = (struct node *)malloc(sizeof(struct node));             n->data=num;             n->link=temp->link;             temp->link=n;             flag=1;         }         c++;         temp=temp->link;      }      if(flag==0)      { printf("\n\nNode Specified Doesn't Exist.Cant Enter The Data");         getch();      }      else      { printf("Data Inserted");         getch();      }      last:      getch(); }  void del(struct node**q,int num) {    if(*q==NULL)       {  printf("\n\nEmpty Linked List.Cant Delete The Data.");           getch();           goto last;       }       else       {       struct node *old,*temp;       int flag=0;       temp=*q;       while(temp!=NULL)       {  if(temp->data==num)           {   if(temp==*q)         /* First Node case */                 *q=temp->link;  /* shifted the header node */                 else                 old->link=temp->link;                  free(temp);                 flag=1;             }             else             {  old=temp;                 temp=temp->link;             }          }          if(flag==0)             printf("\nData Not Found...");          else               printf("\nData Deleted...Tap a key to continue");               getch();         }         last:         getch();       } 

Please help me.

回答1:

The problem you're facing isn't related to Code::Blocks, it's related to the compiler it's using (MinGW by default), and it's because that function isn't standard and wasn't implemented in that compiler. I'm not sure if Borland still provides conio.h, but you could try this one for MinGW.

Have a look at this http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html

You can also try the below snippet, this will work in GCC

#include //gotoxy function void gotoxy(int x,int y) { printf("%c[%d;%df",0x1B,y,x); } main () { gotoxy(25,50); //reposition cursor printf("hello world"); //display text } 

You can also have a look at NCURSES.



回答2:

For what it is worth, here are some Windows versions of the old Borland functions I wrote maybe a decade ago.

/* console_functions.h */   #ifndef __WINAPI_CONSOLE_WRAPPER_H #define __WINAPI_CONSOLE_WRAPPER_H  void init_console_functions (void);  void gotoxy (int x, int y);  void clrscr (void);  char getch  (void);   #endif /* __WINAPI_CONSOLE_WRAPPER_H */   /* console_functions.c */ #include "ConsoleFunctions.h"                       #include   static HANDLE hStdout; static HANDLE hStdin; static CONSOLE_SCREEN_BUFFER_INFO csbi; static const COORD startCoords = {0,0};   void init_console_functions (void) {   hStdout = GetStdHandle(STD_OUTPUT_HANDLE);   hStdin = GetStdHandle(STD_INPUT_HANDLE);    GetConsoleScreenBufferInfo(hStdout, &csbi); }  void gotoxy(int x, int y) {   COORD coord;    coord.X = x;   coord.Y = y;    SetConsoleCursorPosition(hStdout,coord); }   void clrscr(void) {   DWORD dummy;    FillConsoleOutputCharacter(hStdout,                              ' ',                              csbi.dwSize.X * csbi.dwSize.Y,                              startCoords,                              &dummy);       gotoxy(0,0); }   char getch(void) {   INPUT_RECORD inp_rec;   DWORD        bytes_read;   BOOL         success;    do   {     success = PeekConsoleInput(hStdin, &inp_rec, 1, &bytes_read);     FlushConsoleInputBuffer(hStdin);   } while(!success || inp_rec.EventType != KEY_EVENT || bytes_read==0);    return (char)inp_rec.Event.KeyEvent.uChar.AsciiChar; } 


回答3:

Code::Blocks(MinGW) doesnt have conio.h header file. So you cant use gotoxy()

 #include     #include          main()     {             gotoxy(10, 10);             printf("C program to change cursor position.");             getch();        return 0;     } 

this works fine in C. but not in code blocks. The problem you're facing isn't related to Code::Blocks, it's related to the compiler it's using (MinGW by default), and it's because that function isn't standard and wasn't implemented in that compiler. try using these:

SetConsoleCursorPosition(hConsole, TL); HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 

or use Borland C which supports conio.h. For getting it Visit the LINK

# include # include  // you cant use conio.h # include # include # include


回答4:

There are two things for such kinds of questions in C 1) you have to have the proper header with the proper prototp (this i conio.h) 2) you have to have the proper library to link against in this case probably something along libconio.lib

You then have to include the proper header and you have to inform the linker against which libraries you like to link.

The link commands in gcc e.g are -L and -l and both are needed to use conio.

See also: g++ conio.h: no such file or directory

Regards



回答5:

it is error because there is something missing that can handle the gotoxy try this code

int gotoxy(int x,int y) {     COORD coord = {x,y};     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!