0
votes
#include "stdio.h"
#include "conio.h" 
#include "stdlib.h"

#define RANGE(i, min, max) (i<min) || (i>max) ? 1: 0

int main (void )
{
    int r;
    do
    {
        do{
            r=rand();
        } while (RANGE(r, 1, 100));
        printf("%d", r);
    }
    while (!kbhit());
    return 0;
}

When I run this programme I find the following error:

conio.h: No such file or directory

If delete #include "conio.h" then I find the following error:

Undefined symbols for architecture x86_64:
"_kbhit", referenced from:
_main in cckd1NC4.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

How can I solve this problem? What are reason behind these? Would you please tell me?

3
What is your target platform? - Sergey Kalinichenko
Why are you including "conio.h" instead of <conio.h>? Ditto for stdio.h and stdlib.h. - user554546
Using #include "conio.h" rather than #include <conio.h> implies that you are supplying the header file rather than it being part of your compiler's libs. Are you supplying the header file? - David Heffernan
@Kabir conio.h is primarly available on windows, not on OSX - nos
"not work" is not an error message natively produced by C (or any other programming language, for that matter). - user554546

3 Answers

3
votes

the double quotes in #include "something.h" means the file something.h is present in the current directory ie where the source file is located. Where as the <> symbols in #include <something.h> means that something.h is present in the standarad library folder ie for example the /usr/include folder. conio.h is a part of the standarad library so you need to use the <> symbols instead of the double quotes. The error you are seeing is because the linker is not able to find the function definition of kbhit() to link with your code to make the binary/executable.

3
votes

conio.h is an old DOS header, almost never used anymore. The same functionality is now in curses.h. Make sure that curses (or ncurses) is installed on your machine, and try

#include <stdio.h> 
#include <stdlib.h>   
#include <curses.h> 

For what it's worth, RANGE is defined with far too few parenthases;

#define RANGE(i, min, max) (i<min) || (i>max) ? 1: 0

Would have problems with something like

 if(!RANGE(i, 100 200))

Which would become (parens added for clarity)

(!(i<100)) || (i>200)

Which isn't what you want. Define it instead as

#define RANGE(i, min, max) (((i)<(min)) || ((i)>(max)))

And, read up on Macro Pitfalls.

2
votes

in C #include <lib.h> is different to #include "lib.h". The first searches for the header files in the systems include path, and the second in the files include path