Hola, he retomado la programación en C, y se me ocurrio usar punteros por lo del ahorro de memoria.
Lo primero que he hecho es intentar pasar la función de impresión que tenía, hasta ahora usaba una matriz de 256x16 para caracteres de hasta 16x16 pixels, y lo intenté mejorar creando la siguiente matriz global para poder tener hasta 20 tipos de letra disponibles:
typedef struct {unsigned short letra[256][16];} Acaracteres;
typedef struct {int ancho; int alto; unsigned char nombre[20]; int codigo;
Acaracteres *caracteres;} Tiposdeletra;
Tiposdeletra Sletras[20];
No creo que llegue a usar mas de dos o tres, pero como la matriz ocupa poco y ofrece mucho, compensa. Luego llamo a la función que carga el primer tipo de letra para que haya al menos una disponible para el sistema, lo que hace es esto:
void IniLetra8x8()
{ int sigcar, cuenta;
Sletras[0].ancho=8;
Sletras[0].alto=8;
// Sletras[0].nombre=(unsigned char[20])"ZXSpectrum 8x8";
Sletras[0].codigo=1;
Sletras[0].caracteres=(Acaracteres *)malloc(sizeof(Acaracteres));
for (cuenta=0; cuenta<256; cuenta++)
{ for (sigcar=0; sigcar<16; sigcar++)
{ Sletras[0].caracteres[cuenta][sigcar]=0; }
}
Y luego cambiaré en el resto de la función Acaracteres[sigcar][0] por Sletras[0].caracteres[sigcar][0]
sigcar=2;
Acaracteres[sigcar][0]=0xE600; Acaracteres[sigcar][1]=0x8900; Acaracteres[sigcar][2]=0x8900; Acaracteres[sigcar][3]=0xE900;
Acaracteres[sigcar][4]=0x8900; Acaracteres[sigcar][5]=0x8900; Acaracteres[sigcar][6]=0x8900; Acaracteres[sigcar][7]=0x8600;
sigcar++;
Acaracteres[sigcar][0]=0xE200; Acaracteres[sigcar][1]=0x8600; Acaracteres[sigcar][2]=0x8A00; Acaracteres[sigcar][3]=0xE200;
Acaracteres[sigcar][4]=0x8200; Acaracteres[sigcar][5]=0x8200; Acaracteres[sigcar][6]=0x8200; Acaracteres[sigcar][7]=0x8700;
y así seguiría generando los demás caracteres, pero al compilar me muestra el siguiente error:
no match for 'operator[]' in '*(Sletras[0].Tiposdeletra::caracteres + (+(((unsigned int)cuenta) * 8192u)))[sigcar]'
Mensaje que no entiendo en absoluto.
¿como accedo al contenido del array creado? Si es que lo estoy creando correctamente, que lo de los punetros siempre es un poco lio. La línea de
Sletras[0].nombre=(unsigned char[20])"ZXSpectrum 8x8";
también da error, pero ese no me preocupa demasiado.
Gracias.