____________________________________________ Boletín 'El Rincón del C' ____________________________________________ Número 6 - Febrero 2001 http://www.elrincondelc.com mailto:boletin@elrincondelc.com Esta publicación llega a 313 suscriptores. Es un servicio gratuito cortesía de 'El Rincón del C' y se envía a quienes se han suscrito voluntariamente. Si no es tu caso consulta al final del boletín para darte de baja. Contenido de este numero: 1. Nota del editor 2. Novedades en 'El Rincón del C' 3. Novedades DJGPP 4. Articulo: Introducción a la programación gráfica (III) 5. Busca el error (núm. 5) 6. Busca el error: solución al núm. 4 7. El sitio recomendado 8. Colaboraciones en este boletín 9. Encuesta 10. Información de suscripción y contacto ********Publicidad********************** Gorilon.com - Chistes gráficos y de texto nuevos cada día. http://www.gorilon.com ***************************************** ____________________________________________ 1. Nota del editor ____________________________________________ Hola a tod@s, Una vez más estamos aquí. Esta vez con un poco de retraso, ya nos ha llegado Febrero. Este mes tenemos la tercera entrega del minicurso que nos introducirá en el mundo de la programación gráfica. Este artículo nos lo envía Rodolfo Casas desde Bilbao. Si tienes conocimientos sobre algún tema en concreto o has escrito algo interesante envíanoslo. Ayúdanos a mejorar 'El Rincón del C' y el boletín, visita: http://www.elrincondelc.com/ayuda.html Gorka Urrutia gorka@elrincondelc.com http://www.elrincondelc.com ____________________________________________ 2. Novedades en 'El Rincón del C' ____________________________________________ * Sección: Código fuente treedir.c 3,77 Función recursiva que recorre el árbol de directorios a partir del directorio en que nos encontremos cuando realizamos la primera llamada. José María Morales. colas.c 2,6 Programa que almacena caracteres en una cola (no usa listas enlazadas). Almejo Software. menu.c 1 Programa ejemplo que muestra el uso de menús. Gorka Urrutia . http://www.elrincondelc.com/fuentes * Sección: Utilidades CTell - Ayuda a definir complejas declaraciones en C. Metiéndole el texto "declare i as pointer to function returning int" nos resultaría en "int (*i)()". También podemos hacer al revés: introduciendo "explain int (*i)()" tendríamos: "declare i as pointer to function returning int". Freeware. http://www.elrincondelc.com/utils/ * Sección: Cómo se hace Instrucciones para instalar el Turbo C 2.01. http://www.elrincondelc.com/comos ____________________________________________ 3.- Novedades DJGPP ____________________________________________ Recientemente se han actualizado los paquetes que se describen a continuación. Si deseas mas información sobre el DJGPP visita: http://www.elrincondelc.com/djgpp/index.html Paquetes actualizados: Mas información sobre estos paquetes en: http://www.elrincondelc.com/djgpp/djactual.html ************************************************* PARA CONSEGUIR DJGPP EN CD: Si deseas adquirir el CD con el DJGPP actualizado visita: http://www.elrincondelc.com/cddjgpp/index.html ************************************************* ____________________________________________ 4. Articulo: Introducción a la programación gráfica Autor: Rodolfo Casas ____________________________________________ (Usuarios de DJGPP ver nota al pie del artículo). Dejamos pendiente en el número anterior lo de evitar el parpadeo que se producía al ejecutar el programa. Este parpadeo se debe a que la pantalla del ordenador está refrescando la imagen constantemente (al igual que la pantalla de televisión pero a otra frecuencia). El refresco comienza en la línea superior izquierda y va bajando de izquierda a derecha línea a línea. Conviene que cuando comenzamos a dibujar justo haya comenzado el refresco. Para saber cuándo sucede esto usamos la siguiente función: void esperar_refresco() { while ((inportb(0x03DA) & 8) != 0); while ((inportb(0x03DA) & 8) == 0); } Cuando comience el refresco esta función devuelve el control al programa y comienza a dibujar. El programa que hicimos la semana anterior podríamos mejorarlo así para evitar el parpadeo: (http://www.elrincondelc.com/fuentes/graf4.c) /*************************************/ #include union REGS registros; unsigned char far *direccion = (unsigned char far *) 0xA0000000; void modo_grafico( int modo ) { registros.x.ax = modo; int86(0x10,®istros,®istros); } void pixel(int x, int y, unsigned char color) { *(direccion+y*320+x)=color; } void borrar_pantalla() { int i,j; for (i=0; i<320; i++) for (j=0; j<200; j++) pixel(i,j,0); } void rectangulo(int x, int y, int ancho, int alto, int color) { int i,j; for (i=x; i250) x=0; /* Dibujamos el nuevo rectángulo */ rectangulo(x, 50,50,50,2); } getch(); modo_grafico( 0x07 ); return 0; } /*************************************/ Aún así esta técnica no es muy buena. Si tenemos que dibujar muchas cosas en la pantalla no nos dará tiempo a hacerlo antes de que empiece un nuevo refresco. Para evitar esto se usan las 'pantalla virtuales'. Como vimos en la primera entrega, para dibujar escribimos en una zona de la memoria llamada memoria de vídeo. Lo que dibujemos en esta memoria aparecerá en la pantalla. Lo que podemos hacer es reservar una parte de la memoria 'normal' que sea del mismo tamaño que la de vídeo. A esta memoria la llamaremos 'pantalla virtual'. Dibujaremos sobre la pantalla virtual y cuando tengamos el dibujo terminado la copiamos a la memoria de vídeo. (http://www.elrincondelc.com/fuentes/graf5.c) /*************************************/ #include union REGS registros; unsigned char far *direccion = (unsigned char far *) 0xA0000000; void modo_grafico( int modo ) { registros.x.ax = modo; int86(0x10,®istros,®istros); } void borrar_pantalla(char *pantalla) { int i,j; for (i=0; i<200; i++) for (j=0; j<320; j++) *(pantalla+i*320+j)=0; } void rectangulo(int x, int y, int ancho, int alto, int color, unsigned char *pantalla) { int i,j; for (i=x; i250) x=0; /* Dibujamos el nuevo rectángulo en la pantalla virtual */ borrar_pantalla(p_virtual); rectangulo(x, 50,50,50,2,p_virtual); /* Esperamos al refresco de pantalla y copiamos la pantalla virtual en la memoria de vídeo */ esperar_refresco(); copiar_pantalla(p_virtual); } getch(); modo_grafico( 0x07 ); return 0; } /*************************************/ En este ejemplo creamos una pantalla virtual y usamos un puntero (p_virtual) que le referenciará. En cada ciclo del 'while' borraremos la pantalla virtual (borrar_pantalla) y dibujaremos el rectángulo. Esperamos al refresco y copiamos la pantalla virtual a la memoria de vídeo (copiar_pantalla). En la próxima entrega veremos cómo animar un sprite (una imagen) por la pantalla. * * * * Atención!! Si estás usando DJGPP no podrás trabajar con gráficos de la forma que se indica aquí. DJGPP no permite el acceso directo a una dirección de memoria (en este caso 0xA0000), para ello hay que usar otras funciones. Para más información sobre el tema consulta la guía de usuario DeCas: http://www.elrincondelc.com/decas/ug/sp-vga.html * * * * Envíanos tus artículos a mailto:boletin@elrincondelc.com ____________________________________________ 5. Busca el error (núm. 5) ____________________________________________ Aquí tenéis el programa de este numero. A ver quien es el primero que localiza el error. Si crees que lo tienes escribe a: mailto:buscaerror@elrincondelc.com indicando cual es el error. El ganador (no hay premios, solo el gusto de ser el primero) será el primero en contestar correctamente. Este programa tiene un error que no detecta el compilador, cuál es y cómo se arregla. /* Busca el error (núm 5): */ #include #define SIZE_BUFFER 20 int main() { int i; int *buffer = (int *) malloc(SIZE_BUFFER); for( i=0; i int main() { char texto[]="Este es el texto que se debe mostrar"; char *ptexto; ptexto=texto; printf("%s\n",ptexto); for( ;*ptexto;ptexto++) { printf( "%c",*ptexto ); } printf("%s\n",ptexto); return 0; } /* fin del programa */ SOLUCION: (enviada por Leopoldo Lara) El error esta en la ultima vez que intenta escribir el mensaje con printf("%s\n",ptexto). El bucle for anterior ha ido incrementando ptexto, hasta que ha apuntado al final de la cadena. Con lo cual, cuando se realiza la ultima llamada a printf, ptexto NO apunta al texto que queríamos imprimir. ____________________________________________ 7. El sitio recomendado ____________________________________________ El sitio de este mes: http://www.lawebdelprogramador.com Un excelente buscador para programadores. Encontrarás información y cursos de casi cualquier lenguaje de programación que busques. ____________________________________________ 8. Colaboraciones en este boletín ____________________________________________ Si deseas colaborar en este boletín enviando algún articulo o noticias interesantes escribe a: mailto:boletin@elrincondelc.com También nos gustaría que nos contaras que te parece este boletín, que sugerencias tienes, que añadirías, que quitarías,... Para opinar escribe a: mailto:boletin@elrincondelc.com Muchas gracias!! ____________________________________________ 9. Encuesta ____________________________________________ Ayúdanos a mejorar este boletín. Dedícanos un par de minutos y rellena esta encuesta: http://www.elrincondelc.com/encuesta/boletin.html Muchas gracias por tu colaboración! ____________________________________________ 10. Información de suscripción y contacto ____________________________________________ Para inscribirte a este boletín envía un mensaje en blanco a: mailto:elrincondelc-subscribe@egroups.com Si este boletín te ha llegado sin haberlo solicitado o no deseas recibirlo mas envía un mensaje en blanco a: mailto:elrincondelc-unsubscribe.com Si tienes sugerencias o quieres ponerte en contacto con nosotros escribe a: mailto:boletin@elrincondelc.com Prohibida la reproducción parcial o total sin el previo consentimiento por escrito del Editor. Todas las opiniones e ideas reflejadas en este boletín de noticias pertenecen a sus respectivos autores. El Editor no se responsabiliza de los daños causados por el uso de la información contenida en el mismo. Todos los derechos reservados. (c) Gorka Urrutia Landa, 2001 http://www.elrincondelc.com ----fin del boletín---