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
Los punteros me estan empezando a marear.