Problema con páginas virtuales

¿Hola qué tal? Mira, ¿es qué tengo un problemilla con las pantallas virtuales te paso este código vale?
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
void set_modo(int modo);
void put_pixel(int x, int y, int color);
void linea_horiz(int x1, int x2, int y, int color);
void linea_verti(int x, int y1, int y2, int color);
void borra_pantalla(void);
void rectangulo(int x1,int y1,int x2,int y2,int color);
int get_pixel(int x, int y);
void relleno(int x, int y, int color);
void PutPixel(int x, int y, unsigned char color, unsigned char *where);
void FlipTo(unsigned char *source, unsigned char *where);
void set_modo(int modo)
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=modo;
int86(0x10,&inregs,&outregs);
}
void borra_pantalla(void)
{
unsigned char *vgaset=(unsigned char *) MK_FP(0xA000,0);
memset(vgaset,0,64000);
}
int get_pixel(int x, int y)
{
char color;
int offset=320*y+x;
color=peekb(0xA000,offset);
return color;
}
void put_pixel(int x, int y, int color)
{
int offset;
offset=320*y+x;
pokeb(0xA000,offset,color);
}
void linea_horiz(int x1, int x2, int y, int color)
{
int n,offset;
for(n=x1;n<=x2;n++)
{
offset=320*y+n;
pokeb(0xA000,offset,color);
}
}
void linea_verti(int x, int y1, int y2, int color)
{
int n,offset;
for(n=y1;n<=y2;n++)
{
offset=320*n+x;
pokeb(0xA000,offset,color);
}
}
void rectangulo(int x1,int y1,int x2,int y2,int color)
{
linea_horiz(x1,x2,y1,color);
linea_horiz(x1,x2,y2,color);
linea_verti(x1,y1,y2,color);
linea_verti(x2,y1,y2,color);
}
void FlipTo(unsigned char *source, unsigned char *where)
{
memmove(where, source, 64000);
}
void PutPixel(int x, int y, unsigned char color, unsigned char *where)
{
where[(y<<8)+(y<<6)+x]=color;
}
void main(void)
{
int yo,x,y;
unsigned char *DIR_VGA=(unsigned char *) MK_FP(0xA000, 0);
unsigned char *pantalla;
pantalla=(unsigned char *) malloc(64000);
if(pantalla=NULL)
exit(1);
randomize();
set_modo(0x13);
borra_pantalla();
put_pixel(200,100,4);
linea_horiz(12,123,121,4);
linea_verti(12,12,145,4);
rectangulo(134,17,178,40,4);
for(x=0; x<10; x++)
pantalla[320+x]=random(256); //cuando lo hace 20 o 30 veces se cuelga el ordenador
borra_pantalla();
FlipTo(pantalla,DIR_VGA);
getchar();
free(pantalla);
}
¿Por qué se cuelga y que puedo hacer para que no se me cuelgue? Muchas gracias.

2 Respuestas

Respuesta
1
Necesito exactamente saber que es lo que quieres hacer con tu código...
No me es claro...
Me supongo que utilizaste el Borland Turbo C++ 3.0, ¿si no con cual?
Lo compilé y fuera de dos warnings que me salieron observe que el programa en mi computador no es capaz de reservar 64000 de memoria, al principio en el main con el malloc, pude con 62000, el programa solo me muestra en pantalla unas lineas rojas, horizontal y vertical, un pixel rojo en cierta parte de la pantalla, y al finalizar el programa provoca un error y se cierra todo a las malas, para esta ultima parte cambié free(pantalla) por farfree(pantalla).
Usted en al main dentro de un for escribio un comentario acerca de "cuando lo hace 20 o 30 veces se cuelga el ordenador" y no lo entiendo por que el ciclo solo lo hace 10 veces "for(x = 0; x < 10; x++)", no lo entiendo.
Y como te decía no me es claro para nada que es lo que quieres hacer con este programa, que debe mostrar en pantalla, etc; si me respondes esto, de pronto si te pueda ayudar en serio...
Escribe otra vez...
Bye !
Respuesta
1
¿Cómo lo va a hacer 20 o 30 veces, si el bucle solo lo repite 10? Y de todos modos random(256) devuelve numero entre 0 y 255 es eso lo que quieres, porque igual es el 0 el que lo cuelga.
Espero que te vaya bien el consejo, de todos modos, si el problema esta en algún movimiento de memoria, que es lo más probable yo no se mucho sobre las direcciones de memoria del procesador para salida por pantalla y tampoco te recomiendo que hagas esto así, usa alguna librería como DirectX o OpenGL, porque conseguirás un código más portable, y con eso si te podré ayudar.
Lo siento si no te soy de gran ayuda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas