Autor Tema: Codigo raro, explicacion porfavor  (Leído 2091 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado antayhua

  • PIC10
  • *
  • Mensajes: 32
Codigo raro, explicacion porfavor
« 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, // &
}

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Codigo raro, explicacion porfavor
« Respuesta #1 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 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.
« Última modificación: 12 de Agosto de 2014, 22:44:00 por Darkman_A »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Codigo raro, explicacion porfavor
« Respuesta #2 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
« Última modificación: 12 de Agosto de 2014, 23:19:56 por RALF2 »

Desconectado antayhua

  • PIC10
  • *
  • Mensajes: 32
Re: Codigo raro, explicacion porfavor
« Respuesta #3 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 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.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Codigo raro, explicacion porfavor
« Respuesta #4 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:
« Última modificación: 13 de Agosto de 2014, 09:17:43 por RALF2 »

Desconectado BINARIO

  • PIC16
  • ***
  • Mensajes: 156
Re: Codigo raro, explicacion porfavor
« Respuesta #5 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.
000101111 101110000011110 00010 11101 110 1 000111 00010010011010111100 101101001 11110000 001 00 10110 111 00001 01110 0010101 01011110 00 00011111111 0011111 011110001111111111 1011111111101100000000


 

anything