C中对gotoxy的未定义引用

时间:2012-03-20 06:31:47

标签: c codeblocks

我正在尝试用C语言编写程序(windows中的代码:: blocks)。 我已经添加了下面的头文件,它编译没有错误,但是当它运行代码时,它会抛出一个错误未定义的引用gotoxy。 找到完整的代码。 如果我有gotoxy语句,就会出现错误。

# include<stdio.h>
# include<conio.h>
# include<malloc.h>
# include<stdlib.h>
# include<windows.h>
#include<dos.h>
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();
      }

请帮帮我。

6 个答案:

答案 0 :(得分:5)

你遇到的问题与Code::Blocks无关,它与它正在使用的编译器有关(默认为MinGW),这是因为该函数不是标准函数,并且未在该编译器中实现。我不确定Borland是否仍提供conio.h,但您可以MinGW尝试this one

看看这个http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html

您还可以尝试以下代码段,这可以在GCC中使用

#include<stdio.h>
//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
}

您还可以查看NCURSES

答案 1 :(得分:2)

Code :: Blocks(MinGW)没有conio.h头文件。所以你不能使用 gotoxy()

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

这在C中工作正常,但在代码块中没有。 您遇到的问题与Code :: Blocks无关,它与使用它的编译器(默认为MinGW)有关,而且它是因为该功能不是标准的,并没有在该编译器中实现。 尝试使用这些:

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

或使用支持conio.h的Borland C.获取它访问LINK

# include<stdio.h>
# include<conio.h>  // you cant use conio.h
# include<malloc.h>
# include<stdlib.h>
# include<windows.h>

答案 2 :(得分:2)

对于它的价值,这里有一些Windows版本的旧Borland函数我可能在十年前写的。

/* 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 <windows.h>

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 :(得分:1)

C中有两类这类问题 1)你必须有正确的标题与正确的原型(这个我conio.h) 2)你必须有适当的库来链接,在这种情况下可能是libconio.lib

然后您必须包含正确的标头,并且必须通知链接器您要链接哪些库。

gcc中的链接命令例如-L和-l,并且两者都需要使用conio。

另请参阅:g++ conio.h: no such file or directory

此致

答案 4 :(得分:0)

这是错误,因为缺少可以处理gotoxy的东西尝试此代码

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

答案 5 :(得分:0)

代码块GUI无法正常工作gotoxy() 所以你在这里发挥作用。...

    #include<stdio.h>
    #include<windows.h>

    void gotoxy(int a, int b)    
    {
        COORD c;

        c.X=a;        
        c.Y=b;

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);    
    }

    int main()
    {    
        gotoxy(5, 66);
        printf("hello");
        getch();
    }