【问题标题】:undefined reference to gotoxy in C在 C 中未定义对 gotoxy 的引用
【发布时间】:2012-03-20 06:31:47
【问题描述】:

我正在尝试用 C 语言编写程序(windows 中的代码::blocks)。 我在下面的头文件中添加了它,它编译没有错误,但是当它运行代码时,它会抛出一个错误 undefined reference to 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();
      }

请帮帮我。

【问题讨论】:

  • 您可能需要链接提供该功能的库。在 Linux 上是 libncurses 但我不知道 Windows。
  • 它是在什么库中实现的?你在链接吗?添加头文件#include语句并不能解决链接错误。
  • 代码块没有 conio 头
  • @Rohit:请找到更新后的问题
  • 问题还是一样吗?如果您必须使用 conio,请使用其他编译器。

标签: c codeblocks


【解决方案1】:

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

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

你也可以试试下面的 sn-p,这在 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

【讨论】:

    【解决方案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>
    

    【讨论】:

    • 我现在找不到任何gotoxy()
    【解决方案3】:

    不管怎样,这里有一些我可能在十年前编写的旧 Borland 函数的 Windows 版本。

    /* 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;
    }
    

    【讨论】:

    • 为什么getch 中的代码使用PeekConsoleInput 轮询而不是调用ReadConsoleInput(当没有可用输入时会阻塞)?每当一个键被释放时,代码也会返回一个字符。
    【解决方案4】:

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

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

    gcc 中的链接命令,例如 -L 和 -l,它们都是使用 conio 所必需的。

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

    问候

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        代码块 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();
            }
        

        【讨论】:

          猜你喜欢
          • 2018-04-23
          • 2023-03-08
          • 2012-10-18
          • 1970-01-01
          • 2016-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多