Leer búfer de pantalla en C (programación en pc, no PIC)

Hola, hace poco he estado aprendiendo C, y me llego la inquietud de como leer un carácter de la pantalla, es decir, con la instrucción printf se puede imprimir en la pantalla, es decir escribir en ella, pero yo quiero leer un carácter de la pantalla en ciertas coordenadas, por ejemplo, si en la pantalla está escrito "Hola mundo", y yo quiero leer la coordenada (3,1) la función debería devolverme el código ASCII de la letra "l".

He encontrado este procedimiento en la página ehowenespanol, el enlace es:
http://www.ehowenespanol.com/acceder-bufer-pantalla-c-como_200888/


Pero no entiendo el código, y tiene algunos errores de sintaxis que me preocupan. Espero que me ayuden a desarrollar alguna rutina para leer la pantalla, o bien explicarme la función que aparece en esa página, o tal vez, si tuvieran alguna rutina que haga esto mismo, no creo que sea el único que lo haya querido hacer...



Por cierto, uso TurboC para programar...


desde ya, muchas grasias...
 
Mmmm hasta donde tengo entendido... eso no es posible... al menos no de forma facil...
 
En Turbo C dispones de la librería conio, donde puedes encontrar las funciones puttext y gettext que pueden ser de utilidad para lo que pretendes.

Estas funciones son específicas de Turbo C y precisan de la cooperación de la BIOS de video, ha de ser compatible IBM, puede que en algunos casos no funcionen correctamente.
 
En Turbo C dispones de la librería conio, donde puedes encontrar las funciones puttext y gettext que pueden ser de utilidad para lo que pretendes.

Estas funciones son específicas de Turbo C y precisan de la cooperación de la BIOS de video, ha de ser compatible IBM, puede que en algunos casos no funcionen correctamente.

A esas librerías locas, cierto, esa es otra alternativa sin meterte tanto con el hard.

Es increíble que se siga dando clases con TurboC, teniendo la posibilidad de usar cualquier distribución de linux con gcc... la verdad que es una pena :rolleyes:.
 
pues nosotros estamos entrando recien en el mundo del C, y como hemos crecido usando winsdows y no linux es mejor, creo yo, no complicarnos con el aprendizaje de un nuevo sistema operativo, y solo centrarnos en aprender C, almenos eso creo que pienzan los profesores...

revisare lo de las instrucciones puttext y gettext, parecen prometedoras...

grasias por su pronta respuesta. por cierto, les contare para que lo queria, estoy creando una funcion para dibujar rectangulos y lineas en modo texto en la pantalla, y para no crear conflictos entre rectangulos, necesito saver lo que hay antes de dibujar el rectangulo, asi los puedo unir con otro caracter especial y hacer que queden unidos ambos rectangulos dejando un mejor resultado en pantalla... ademas, se me acava de ocurrir que podria crear una funcion para hacer una "captura" de todo lo que este en la pantalla y guardarlo, eso podria ser util...

grasias por sus sugerencias...les contare como me ba...
 
Yo recomiendo usar linux, es mas para desarrolladores. Es totalmente abierto y ademas desde la consola conseguis los "man"de las librerias. Tambien, tenes a las queridas systemcall como open, write, read que te facilitan la vida. Si se desea resolver cosas como sockets, archivos o sacar datos por algun tipo de periferico windows no es muy bueno para esto.
Bueno, ahora volviendo al tema, si queres leer el buffer de video estas en un quilombo muy grande. Si te queres parar directamente en la posicion donde empieza el buffer en el mapa de memoria, el OS te va a putear.
Lo que te recomiendo es que hagas un scanf. Lo que hace esta funcion es devolver en un buffer. Lo bueno de esto es que tiene el mismo formato que printf.
scanf y printf son macros de las famosas fprintf y fscanf de manejos de archivos. Las recomiendo si quieren leer archivos con texto.

Eso de leer la pantalla no es necesario, vos controlas lo escrito en la pantalla, no tenes porque leerla y ram te sobra. Create una matriz en la ram.
 
pues nosotros estamos entrando recien en el mundo del C, y como hemos crecido usando winsdows y no linux es mejor, creo yo, no complicarnos con el aprendizaje de un nuevo sistema operativo, y solo centrarnos en aprender C, almenos eso creo que pienzan los profesores...

revisare lo de las instrucciones puttext y gettext, parecen prometedoras...

grasias por su pronta respuesta. por cierto, les contare para que lo queria, estoy creando una funcion para dibujar rectangulos y lineas en modo texto en la pantalla, y para no crear conflictos entre rectangulos, necesito saver lo que hay antes de dibujar el rectangulo, asi los puedo unir con otro caracter especial y hacer que queden unidos ambos rectangulos dejando un mejor resultado en pantalla... ademas, se me acava de ocurrir que podria crear una funcion para hacer una "captura" de todo lo que este en la pantalla y guardarlo, eso podria ser util...

grasias por sus sugerencias...les contare como me ba...

En realidad te estas complicando la vida, primero debes especificar si es dos, windows, linux o consola de windows (ese es un frame especial). El codigo de ejemplo que viste es para utilizarlo con una consola windows o cmd y lo que lee es el buffer especifico de la consola.

Ademas el que esta creando la parte visual eres tu y tu decides por medio de cordenadas donde va cada cosa.

Te adjunto un proyecto que realice de control automatico donde se controla la consola, tanto buffer como leer y escribir.

atte
jvk85321
 

Adjuntos

  • CPPCONTROL.zip
    613.9 KB · Visitas: 5
Estamos usando windows 7 para ejecutar el TurboC, y este se ejecuta en la consola, por lo que todos los programas que aga (por ahora) se ejecutaran en la consola... le hechare un vistazo al archivo que has publicado...

@electroandres
Había pensado en hacer eso, una especie de respaldo de cambios de la pantalla que guarde siempre el estado de la pantalla, pero eso haria que fuese necesario colocar después de cada instrucción de salida, una instrucción que guarde esos nuevos datos en el respaldo, lo que complica el código tremendamente. Una solución a eso es crear instrucciones nuevas de salida de datos que incluyeran al respaldo necesario. también esto aria que si quiero usar las funciones que leen la pantalla por algún motivo, deberé cambiar todo el código para adaptarlo a los nuevos requerimientos de la instrucción... en resumen, todo un problema, mi idea es crear una rutina que sea útil no solo para un programa, sino para todos los que haga... pienso colocarlas en un archivo .h y usarlas cuando me plazca...

y usar Linux para desarrollar, me parece una muy buena idea, un sistema completamente libre., que me da acceso directo a la memoria y periféricos y a cada rincón de la pc, pero para eso mejor uso un Windows 95 o 98 que no es tan complicado como los Windows con núcleo NT...

estoy aprendiendo a usar las instrucciones puttext y gettext, y creo que satisfacen completamente mis requerimientos... muchas gracias...
 
En aras de la cooperación, dejo aquí el código que cree con la instrucción gettext, usada para leer la pantalla. El código tiene 3 funciones: rectangulo, linea y barraprogreso; el propósito de cada una es evidente, si leen el código entenderán como usarlas si les llama la atención, y si tienen dudas pregunten y me esforzare en responder. El código trae incluida la función main, el único propósito de esta es usar las funciones para probar su funcionamiento. Las funciones son dependientes unas de otras en el siguiente orden, la función barraprogreso es dependiente de la función rectangulo y de la función linea, la función rectangulo es dependiente de la función linea, y la función linea es independiente. Evidentemente las funciones necesitan las librerías conio.h y stdio.h

Descarguen el código y ejecútenlo, modifíquenlo, como quieran. También les dejo el archivo .h que incluye a las 3 funciones...
 

Adjuntos

  • Codigo.rar
    3.7 KB · Visitas: 6
gonzalocg, si quieres solo por curiosidad, investiga las funciones gráficas de la bios de un equipo AT, la forma de enlazar ensamblador dentro de código C es muy simple, en cualquier parte de la función colocas la instrucción:
Código:
asm {
...
...
}

y dentro de las llaves puedes mener ensamblador dentro del código C.

Te lo comento porque puedes implementar funciones muy chulas, equivalentes a las de conio.h y stdio.h, y otras que no están. Por ejemplo, tienes gettext, puttext, gotoxy, getche, clrscr, etc..., pero con ensamblador puedes leer de pantalla tanto las letras como sus colores, cambiar el modo de video, el tamaño del cursor (o esconderlo si quieres con tamaño 0) etc, (gracias a eso y el modo de texto de 40 caracteres, hice en su día un tetrix en modo texto programado en C (los caracteres eran bloques de corazoncitos, tréboles, picas, caritas, etc).

Para sacar todo el potencial de la consola usando las funciones de la BIOS, investiga los servicios de la interrupción INT 10h.



Por cierto, si quieres probar los ejemplos que te han pasado, no son para aplicaciones de ejecución en modo real, sino en modo consola o modo virtual 86 dentro de un sistema operativo de 32 bits, tipo windows. Si quieres compilar usando esas funciones (o para crear programas de windows), tienes, bien el Visual Studio de Microsoft, o el IDE popular gratuito llamado DJGPP, pero para mí el más fácil, el que genera binarios más pequeños, y en el que puedes portar programas de turbo C a consola de windows sin grandes complicaciones (y el que yo uso para programar bajo windows), es el lcc-win32, cuyo editor de windows se llama wedit.

Por otro lado, la interrupción 10h de la BIOS es eso, de la BIOS, lo que significa que funcionará igual en programas compilados bajo DOS, como bajo consola de Linux.
 
Última edición:
Atrás
Arriba