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.
我正在尝试用C语言编写一个程序(代码::windows中的块)。我添加了下面的头文件,它没有错误地编译,但是在运行代码时,它会抛出一个未定义的关于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();
}
Please help me.
请帮助我。
5 个解决方案
#1
6
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
.
您所面临的问题与代码无关::块,它与它使用的编译器相关(默认情况下是MinGW),这是因为该函数不是标准的,在编译器中没有实现。我不确定Borland是否还提供conio。但是你可以试试这个。
Have a look at this http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html
看看这个http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html ?
You can also try the below snippet, this will work in GCC
您还可以尝试下面的代码片段,这将在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
}
You can also have a look at NCURSES.
你也可以看一下NCURSES。
#2
3
For what it is worth, here are some Windows versions of the old Borland functions I wrote maybe a decade ago.
对于它的价值,这里有一些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
2
Code::Blocks(MinGW) doesnt have conio.h header file. So you cant use gotoxy()
代码:块(MinGW)根本没有conio。h头文件。所以你不能使用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:
这种方法在c语言中很有效,但在代码块中没有。您所面临的问题与代码无关::块,它与它使用的编译器相关(默认情况下是MinGW),这是因为该函数不是标准的,在编译器中没有实现。试着使用这些:
SetConsoleCursorPosition(hConsole, TL);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
or use Borland C which supports conio.h. For getting it Visit the LINK
或者使用支持conio.h的Borland C。让它访问链接。
# include<stdio.h>
# include<conio.h> // you cant use conio.h
# include<malloc.h>
# include<stdlib.h>
# include<windows.h>
#4
1
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
在c1中有两种类型的问题,你必须要有合适的标题和合适的原型(我同意)2)你必须有合适的库来链接,在这个例子中可能是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.
gcc e中的链接命令。g是-L和-L,两者都需要使用conio。
See also: g++ conio.h: no such file or directory
参见:g++ conio。h:没有这样的文件或目录。
Regards
问候
#5
0
it is error because there is something missing that can handle the gotoxy try this code
它是错误的,因为缺少可以处理gotoxy的代码。
int gotoxy(int x,int y)
{
COORD coord = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
#1
6
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
.
您所面临的问题与代码无关::块,它与它使用的编译器相关(默认情况下是MinGW),这是因为该函数不是标准的,在编译器中没有实现。我不确定Borland是否还提供conio。但是你可以试试这个。
Have a look at this http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html
看看这个http://projectsofashok.blogspot.in/2010/05/gotoxy-in-codeblocks.html ?
You can also try the below snippet, this will work in GCC
您还可以尝试下面的代码片段,这将在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
}
You can also have a look at NCURSES.
你也可以看一下NCURSES。
#2
3
For what it is worth, here are some Windows versions of the old Borland functions I wrote maybe a decade ago.
对于它的价值,这里有一些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
2
Code::Blocks(MinGW) doesnt have conio.h header file. So you cant use gotoxy()
代码:块(MinGW)根本没有conio。h头文件。所以你不能使用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:
这种方法在c语言中很有效,但在代码块中没有。您所面临的问题与代码无关::块,它与它使用的编译器相关(默认情况下是MinGW),这是因为该函数不是标准的,在编译器中没有实现。试着使用这些:
SetConsoleCursorPosition(hConsole, TL);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
or use Borland C which supports conio.h. For getting it Visit the LINK
或者使用支持conio.h的Borland C。让它访问链接。
# include<stdio.h>
# include<conio.h> // you cant use conio.h
# include<malloc.h>
# include<stdlib.h>
# include<windows.h>
#4
1
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
在c1中有两种类型的问题,你必须要有合适的标题和合适的原型(我同意)2)你必须有合适的库来链接,在这个例子中可能是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.
gcc e中的链接命令。g是-L和-L,两者都需要使用conio。
See also: g++ conio.h: no such file or directory
参见:g++ conio。h:没有这样的文件或目录。
Regards
问候
#5
0
it is error because there is something missing that can handle the gotoxy try this code
它是错误的,因为缺少可以处理gotoxy的代码。
int gotoxy(int x,int y)
{
COORD coord = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}