referencia indefinida a gotoxy en C

7 minutos de lectura

avatar de usuario
Rasmi Ranjan Nayak

Estoy tratando de escribir un programa en lenguaje C (código :: bloques en Windows). He agregado los archivos de encabezado a continuación, se compila sin errores, pero cuando se trata de ejecutar el código, arroja un error de referencia indefinida a gotoxy. Encuentra el código completo. El error viene donde alguna vez tengo declaraciones 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();
      }

Por favor, ayúdame.

  • Probablemente necesite vincular la biblioteca que proporciona esa función. En Linux eso sería libncurses pero no tengo idea para Windows.

    – Basile Starynkevitch

    20 de marzo de 2012 a las 6:33

  • ¿En qué librería está implementado? ¿Lo estás vinculando? Agregar archivo de encabezado #include declaraciones no va a resolver un error de enlace.

    –Carl Norum

    20 de marzo de 2012 a las 6:33


  • codeblock no tiene encabezado conio

    – Rohit Vipin Mathews

    20 de marzo de 2012 a las 6:45


  • @Rohit: encuentre la pregunta actualizada

    – Rasmi Ranjan Nayak

    20 de marzo de 2012 a las 6:47

  • ¿el problema no sigue siendo el mismo? si tiene que usar conio use otro compilador.

    – Rohit Vipin Mathews

    20 de marzo de 2012 a las 6:49

avatar de usuario
anantha krishnan

El problema al que te enfrentas no está relacionado con Code::Blocks, está relacionado con el compilador que está usando (MinGW por defecto), y es porque esa función no es estándar y no se implementó en ese compilador. No estoy seguro de si Borland todavía proporciona conio.hpero podrías intentarlo Éste por MinGW.

Echa un vistazo a esto http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html

También puede probar el siguiente fragmento, esto funcionará en GCC

#include //función gotoxy 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.

user avatar
Rohit Vipin Mathews

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

 #include<stdio.h>
    #include<conio.h>     
    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<stdio.h>
# include<conio.h>  // you cant use conio.h
# include<malloc.h>
# include<stdlib.h>
# include<windows.h>

  • i cant find any gotoxy() now

    – Rohit Vipin Mathews

    Mar 20, 2012 at 6:50

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

  • Why is the code in getch polling using PeekConsoleInput instead of calling ReadConsoleInput (which blocks when no input is available)? The code also returns a character whenever a key is released.

    – IInspectable

    Nov 9, 2018 at 15:24


user avatar
Friedrich

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

user avatar
MarPin

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);
}

user avatar
quent

Code blocks GUI doesn’t work gotoxy()
so you make function it here….

    #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();
    }

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad