TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: antayhua en 12 de Agosto de 2014, 21:44:15

Título: Codigo raro, explicacion porfavor
Publicado por: antayhua en 12 de Agosto de 2014, 21:44:15
Hola amigos tengo esta parte de código:
(char *) ((int) font5x8 + (5 * charToWrite) + i)

 pero no lo entiendo alguien puede aclarar mi duda; la palabra font5x8 es un array.

void GLCD_WriteChar(char charToWrite)
{
    int i;
    charToWrite -= 32;
    for (i = 0; i < 5; i++)
        GLCD_WriteData(GLCD_ReadByteFromROMMemory((char *) ((int) font5x8 + (5 * charToWrite) + i)));//EXPLICACION.
    GLCD_WriteData(0x00);
}

const unsigned char /*PROGMEM*/ font5x8[] = {
    0x00, 0x00, 0x00, 0x00, 0x00, // space
    0x00, 0x00, 0x5F, 0x00, 0x00, // !
    0x00, 0x07, 0x00, 0x07, 0x00, // "
    0x14, 0x7F, 0x14, 0x7F, 0x14, // #
    0x24, 0x2A, 0x7F, 0x2A, 0x12, // $
    0x23, 0x13, 0x08, 0x64, 0x62, // %
    0x36, 0x49, 0x55, 0x22, 0x50, // &
}
Título: Re: Codigo raro, explicacion porfavor
Publicado por: Darkman_A en 12 de Agosto de 2014, 22:41:00
Hola.
Espero no equivocarme pero creo que es así.
Si mal no recuerdo de mis clases de C, el nombre de un arreglo es un puntero al comienzo del arreglo.....sip, lo he buscado en un libro y dice "Un nombre de un arreglo sin corchetes es un apuntador al primer elemento del arreglo"
Entonces  font5x8  te da la direccion del comienzo del arreglo.

Por otra parte vos ingresas el caracter que queres imprimir segun la funcion
void GLCD_WriteChar(char charToWrite)

Supongamos que el caracter que queres imprimir es el numeral #
El numeral, segun esta hermosa tablita (http://www.elcodigoascii.com.ar/codigo-americano-estandar-intercambio-informacion/codigo-ascii.gif) de caracteres ASCII que me encontre por ahí es 35 en decimal
Volviendo a la funcion, una vez ingresado el caracter, la misma hace:
charToWrite -= 32;
O sea, hace 35-32=3 y lo guarda en charToWrite. Entonces ahora charToWrite=3
Lo que esta haciendo
(char *) ((int) font5x8 + (5 * charToWrite) + i)
es armar una direccion de un puntero. Ya teniamos el comienzo en font5x8 ahora le sumamos (5 * chartoWrite).
Si te fijas cada caracter tiene 5 bytes.
entonces 5 x 3, saltamos 15 bytes. Saltamos

  0x00, 0x00, 0x00, 0x00, 0x00, // space
    0x00, 0x00, 0x5F, 0x00, 0x00, // !
    0x00, 0x07, 0x00, 0x07, 0x00, // "
Quedando justo en la direccion del comienzo de el numeral.
Luego cambiando (incrementando) el valor de i vamos barriendo los 5 bytes (incrementamos el puntero).
¿Se entiende?

Saludos.
Título: Re: Codigo raro, explicacion porfavor
Publicado por: RALF2 en 12 de Agosto de 2014, 23:16:31
Yo agregaria a lo expuesto por Darkman_A, lo siguiente:

Citar
(char *) ((int) font5x8 + (5 * charToWrite) + i)

(int) font5x8... es un casting para convertir provicionalmente (para efectos de calculo) los char de font5x8 en int y luego (char *)... crea un puntero a un array tipo char (en nuestro caso, font5x8).   :mrgreen:

Saludos
Título: Re: Codigo raro, explicacion porfavor
Publicado por: antayhua en 13 de Agosto de 2014, 00:57:13
Hola.
Espero no equivocarme pero creo que es así.
Si mal no recuerdo de mis clases de C, el nombre de un arreglo es un puntero al comienzo del arreglo.....sip, lo he buscado en un libro y dice "Un nombre de un arreglo sin corchetes es un apuntador al primer elemento del arreglo"
Entonces  font5x8  te da la direccion del comienzo del arreglo.

Por otra parte vos ingresas el caracter que queres imprimir segun la funcion
void GLCD_WriteChar(char charToWrite)

Supongamos que el caracter que queres imprimir es el numeral #
El numeral, segun esta hermosa tablita (http://www.elcodigoascii.com.ar/codigo-americano-estandar-intercambio-informacion/codigo-ascii.gif) de caracteres ASCII que me encontre por ahí es 35 en decimal
Volviendo a la funcion, una vez ingresado el caracter, la misma hace:
charToWrite -= 32;
O sea, hace 35-32=3 y lo guarda en charToWrite. Entonces ahora charToWrite=3
Lo que esta haciendo
(char *) ((int) font5x8 + (5 * charToWrite) + i)
es armar una direccion de un puntero. Ya teniamos el comienzo en font5x8 ahora le sumamos (5 * chartoWrite).
Si te fijas cada caracter tiene 5 bytes.
entonces 5 x 3, saltamos 15 bytes. Saltamos

  0x00, 0x00, 0x00, 0x00, 0x00, // space
    0x00, 0x00, 0x5F, 0x00, 0x00, // !
    0x00, 0x07, 0x00, 0x07, 0x00, // "
Quedando justo en la direccion del comienzo de el numeral.
Luego cambiando (incrementando) el valor de i vamos barriendo los 5 bytes (incrementamos el puntero).
¿Se entiende?

Saludos.

gracias por la explicación me aclaro algunas dudas, pero aun tengo una pequeña duda que es el (char *), según el amigo RALF2 es un puntero a un array.
he visto un ejemplo mas que es este parecido:
int compara_float(const void *a,const void *b)
{
float *x,*y;
x=(float *)a;
y=(float *)b;
return (*x-*y);
}
a mi entender el (float *) es un cast para el puntero 'a' como este es un puntero lleva el asterisco después del float, nose si será asi.
Título: Re: Codigo raro, explicacion porfavor
Publicado por: RALF2 en 13 de Agosto de 2014, 09:14:34
Citar
a mi entender el (float *) es un cast para el puntero 'a' como este es un puntero lleva el asterisco después del float, nose si será asi.

Asi es, un cast a un float   :mrgreen:
Título: Re: Codigo raro, explicacion porfavor
Publicado por: BINARIO en 13 de Agosto de 2014, 16:29:00
A mi me parece que es un CAST para pasar lo que tengas dentro del parentesis a una variable de tipo char.