• Domingo 15 de Diciembre de 2024, 08:42

Autor Tema:  Pantallas Virtuales  (Leído 1250 veces)

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Pantallas Virtuales
« en: Miércoles 18 de Agosto de 2004, 03:15 »
0
Es que estamos pobres :lol:     (no hay memoria :( )

En estos días traté de hacer unas rutinas gráficas y me topé con un probema.
Este es mi código recortado
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
typedef unsigned char *PANTVIRT;

PANTVIRT pv;

/* Asi es como creo la pantalla virtual */
PANTVIRT CrearPantallaV(PANTVIRT *pv)
{
    *pv = (BYTE *) calloc(64000, sizeof(BYTE));
    return(*pv);
}


/* Es así como la llamo */

if(!SetPVirtual(&pv))
{
     printf("\nNo hay memoria suficiente\n");
     exit(1);
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Mi problema es que al ejecutar el programa de prueba me devualve el error que yo traté de prevenir: El de que si no hay memoria. Si quito la comprobación
if (!SetPVirtual(&pv))
Entonces el ordenador se bloquea(Nunca se me bloqueó así, tengo que reiniciar mi XP o WIN 98,  SI o SI, porque no hace nada, nisiquiera el Ctrl+Alt+Supr funcionan)

No se como solucionar ese problema por eso espero que alguien sepa una solución.
Desde ya, Gracias.

Por cierto, no creo que sea ausencia de memoria porque de esta, para ejecutable de 16 bit, SOBRA.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Pantallas Virtuales
« Respuesta #1 en: Miércoles 18 de Agosto de 2004, 20:46 »
0
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
typedef unsigned char *PANTVIRT;

PANTVIRT pv;

/* Asi es como creo la pantalla virtual */
PANTVIRT CrearPantallaV()
{
   PANTVIRT pv = NULL;
   pv = (char *)malloc(64000* sizeof(char));
   if(pv != NULL)
   {
      memset(p, '\0',sizeof(char)*64000);
       return pv;
   }
   else
  {
     return NULL;
   }
}
...
...
PANTVIRT  p;
 if((p = CrearPantallaV())!=  NULL)
{
   ...
   ...
   ...
}
else
{
   printf("\nNo hay memoria suficiente\n");
}
...
...
...
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

yo he cambiado tu codigo a como me parece esta mejor ya que lo que tenias arrojaba error de memoria ya que estabas devolviendo un apuntado a un apuntador es decir un **p y ademas la funcion retornaba el apuntador y adicionalmente recibia un parametro lo cual no es necesario porque se hace mejor por solo uno de los dos.
De todas maneras te quedan varias cosas pendientes que es mejor que aclares un poco mas tus intenciones .
Ademas te funciona mejor el malloc que el calloc... para tu caso, y he inicializado la seccion de memoria separada.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Pantallas Virtuales
« Respuesta #2 en: Miércoles 18 de Agosto de 2004, 21:13 »
0
Si tenés razon cuando dices que mi función recibia como paramentro un apuntador a otro. Lo que no se me habia ocurrido es que esto trairia aparejado este problema. Trato de coregir la función y a ver que pasa.

Gracias Juank.

Pruebo y despues cuento si salió. :gracias:

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Pantallas Virtuales
« Respuesta #3 en: Miércoles 18 de Agosto de 2004, 22:29 »
0
Probé utilizando el codigo que me pasaste y me devuelve un error diciendo que no puede convertir    "* to **". Si cambio el codigo para que sea  "**"  entonces  quedo como estaba antes : No hay memoria.
Mi idea es crear una libreria que me permita realizar "Doble Buffering" de manera que quiero crear una pantalla virtual, rellenarla con pixeles y luego volcarla a la pantalla.
Para no complicar las cosas, traté de simplificar el codigo lo más posible de manera que quede claro donde está el error. El error de compilacion lo remarqué.
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
#include <stdio.h>
#include <mem.h>
#include <conio.h>
#include <dos.h>
#include <alloc.h>



typedef unsigned char *PANTVIRT;
typedef unsigned char BYTE;

BYTE *PANTALLA=(BYTE *) MK_FP(0xA000, 0);

/*************************ERROR*********************************/
PANTVIRT *CrearPantallaV()
{
  PANTVIRT *pv = NULL;
  pv = (char *)malloc(64000* sizeof(char));
  //ERROR: Cannot convert 'char *' to 'unsigned char * *'
  // si pongo *pv = (char *)... MEMORIA INSUFICIENTE

  if(pv != NULL)
  {
        memset(pv, '\0',sizeof(char)*64000);
        return pv;
  }
  else
 {
     return NULL;
  }
}

/******************************************************************/

void DestruirPantallaV(PANTVIRT *pv)
{
    free(*pv);
    *pv = NULL;
}

void PonModo(unsigned char modo)
{
    union REGS r;

    r.h.ah = 0;
    r.h.al = modo;
    int86(0x10, &r, &r);
}

void PonPixel(int x, int y, BYTE color, PANTVIRT donde)
{
    donde[(y << 8) + ( y << 6) + x] = color;
}

void CopiarPantalla(PANTVIRT origen, PANTVIRT destino)
{
     memmove(destino, origen, 64000);
}

int main() {
    int i, j;
    PANTVIRT  buffer;

    if((buffer = CrearPantallaV()) !=  NULL)
        //ERROR: Cannot convert 'unsigned char * *' to 'unsigned char *'
        // Consecuencia error anterior
    {
        PonModo(0x13);
        for (i = 0; i < 320; i++)
            for (j = 0; j < 200; j++)
                PonPixel(i, j, i, buffer);
        CopiarPantalla(buffer, PANTALLA);
        getch();
        DestruirPantallaV(&buffer);
        PonModo(0x3);
        getch();
        return (0);
    }
    else
    {
        PonModo(0x3);
        printf("\nNo hay memoria suficiente\n");
        return (255);
    }
}
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Será una opcion del compilador para que realize casting?
'unsigned char *'  to 'unsigned char**'
Probé con el DJGPP y el Turbo C++ 3.X

 :wacko: Los punteros me estan empezando a marear.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Pantallas Virtuales
« Respuesta #4 en: Miércoles 18 de Agosto de 2004, 23:30 »
0
Bueno debes de mirar le codigo que usas porque yo no corregi lo del doble apuntador..
ya lo corregi..

 :angry: Debes ser mas observador!!!!  :whistling:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Pantallas Virtuales
« Respuesta #5 en: Jueves 19 de Agosto de 2004, 22:45 »
0
Encontré la falla, Por alguna extraña razon cuendo ejecuto el programa desde la IDE del Turbo C++ Dice memoria insuficiente pero lo extraño es que el programa compilado no hace esto.
En el caso de DJGPP en los dos casos dioce memoria insuficiente así que voy a investigasr.