Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: abreu20011 en 28 Julio 2012, 21:58 pm



Título: getch() y getche() sin conio.h
Publicado por: abreu20011 en 28 Julio 2012, 21:58 pm
Saludos :)

Sólo queria preguntar una duda que tengo. Cuando compilo un programa en C e incluyo el #define <stdio.h> pero no el conio.h puedo usar las funciones getch() y getche.

Sin embargo, si busco en la librería de stdio.h no salen, sin embargo si para la librería conio.h.

¿Es posible que funcione por compilar desde Windows aunque no incluya las librerías? Es que no se muy bien por que pasa eso :)

Del mismo modo, puedo usar system() sin incluir stdlib.h :S

Gracias


Título: Re: getch() y getche() sin conio.h
Publicado por: Queta en 28 Julio 2012, 23:10 pm
¿Qué compilador usas?


Título: Re: getch() y getche() sin conio.h
Publicado por: abreu20011 en 28 Julio 2012, 23:30 pm
Me pasa tanto usando el MinGW en windows, como con el de DevC++ :)


Título: Re: getch() y getche() sin conio.h
Publicado por: Queta en 28 Julio 2012, 23:35 pm
Dev-C++ usa MinGW también; el compilador te debe estar metiendo basura (DLLs adicionales que no necesitas) en tu ejecutable. Bájate el Dependency Walker para ver si se trata de eso.


Título: Re: getch() y getche() sin conio.h
Publicado por: yoxter en 29 Julio 2012, 00:01 am
no estoy seguro puede ser ncurses lo que buscas, no uso windows de momento pero creo que dev-c++ usa gcc y conio no existe para gcc
o tal vez uconio ?

pásate por aquí

http://es.tldp.org/Tutoriales/NCURSES/tutorial-ncurses.html  (http://es.tldp.org/Tutoriales/NCURSES/tutorial-ncurses.html)



Título: Re: getch() y getche() sin conio.h
Publicado por: Queta en 29 Julio 2012, 00:08 am
conio.h no existe para Linux pero sí para Windows y es compatible con la gran mayoría de compiladores de C.


Título: Re: getch() y getche() sin conio.h
Publicado por: rir3760 en 29 Julio 2012, 04:08 am
¿Es posible que funcione por compilar desde Windows aunque no incluya las librerías? Es que no se muy bien por que pasa eso :)

Del mismo modo, puedo usar system() sin incluir stdlib.h
Es posible pero no se recomienda.

Antes de llamar a una función se debe indicar su prototipo para que así el compilador pueda verificar que las llamadas y definición (si aplica) coincidan. La forma usual es incluyendo el encabezado que corresponda. Por ejemplo:
Código
  1. #include <stdlib.h> /* Prototipo de "system" */
  2.  
  3. /* ... */
  4.  
  5. system("pause");

Si no se indica el prototipo el compilador asume lo siguiente:
1) El tipo de retorno de la función es "int".
2) El numero y tipo de cada argumento esta dado por la llamada.

Si ello no es correcto se presentan problemas. Por ejemplo:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   double num;
  6.  
  7.   num = atof("3.141592"); /* Falta el prototipo de "atof" */
  8.   printf("%f\n", num);
  9.  
  10.   return 0;
  11. }
Ahí el tipo de retorno de "atof" se asume como "int" cuando en realidad es de tipo "double".

Para evitar casos como ese lo mejor es incluir los prototipos (vía encabezados) y nos olvidamos del problema.

Un saludo


Título: Re: getch() y getche() sin conio.h
Publicado por: abreu20011 en 29 Julio 2012, 05:26 am
Saludos y muchas gracias por las diversas respuestas :)

El Dependency Walker lo he bajado y comprobado mi archivo, y no me entero mucho de como va, más que de que tengo un error (no sé si mi archivo, o un error del programa a leerlo) y sí, encontré la función getch() pero no aclara mi duda >.<

El NCurses lo miré por encima y tiene buena pinta, pero primero quiero acabar bien C y las librerías ANSI C que ponerme con otra cosa. Por otra parte, no entiendo muy bien en qué me puede ayudar respecto a mi duda.

Y respecto a a lo que dices rir3760, ¿como que es posible, pero no se recomienda? ¿Me estas diciendo que es culpa de Windows que se me añaden esas librerías? Si es asi, pues que allanamiento de la programación xD

He estado mirando, y me he dado cuenta de que puedo, sencillamente, no declarar ni un solo include que el programa anda. Con el error que dices, pero anda. ¿Esto es correcto? ¿Es decir, si no declaráis las librerías os va? :S

Que yo sepa, no debería ser así, no? Porque si no, ¿como sabe que printf hace una cosa y no otra? Me siento muy perdido ahora mismo xD

Un saludo


Título: Re: getch() y getche() sin conio.h
Publicado por: Queta en 29 Julio 2012, 15:29 pm
El NCurses lo miré por encima y tiene buena pinta, pero primero quiero acabar bien C y las librerías ANSI C que ponerme con otra cosa. Por otra parte, no entiendo muy bien en qué me puede ayudar respecto a mi duda.

Si quieres aprender, no uses conio.h ya que no forma parte del estándar.

Y respecto a a lo que dices rir3760, ¿como que es posible, pero no se recomienda? ¿Me estas diciendo que es culpa de Windows que se me añaden esas librerías? Si es asi, pues que allanamiento de la programación xD

Es posible si el compilador añade las librerías por defecto, la culpa no es de Windows. Por eso te digo que compruebes con el Dependency Walker a ver si realmente es el compilador quien te añade basura.


Título: Re: getch() y getche() sin conio.h
Publicado por: Fire544 en 30 Julio 2012, 03:09 am
Mira abreu20011: Si andas en un compilador GCC en tu caso, dev-c++ compila con GCC, la causa a tu problema es que a veces cuando el IDE intenta buscar los binarios, libs e includes, no los encuentra porque pierde el enlce a los respectivos directorios. Verifica bien la configuracion de tu IDE y si el problema persiste entonces reinstala el IDE. Otra causa puede ser cuando incluyes libs que hacen llamadas desde si mismas a otras libs, por ejemplo windows.h hace llamdas a stdlib.h y tambien a winsock.h, sino reinicia tu ordenador y vuelve a iniciar el IDE y compila, si el problema sigue entonces postea nuevamente !!

Suerte amigo !! :xD


Título: Re: getch() y getche() sin conio.h
Publicado por: theluigy13etv en 27 Octubre 2012, 19:56 pm
Yo también me había preguntando esto, me parece que usando Dev C++ no necesito utilizar las directivas de preprocesado include para agregar los archivos de cabeceras stdio.h y stdlib.h, ya que sin agregar esas cabeceras puedo utilizar las funciones printf, scanf, system, incluso getch() a pesar que no pertenece a la biblioteca estándar.  :-(