Autor Tema: linea código con while  (Leído 102 veces)

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

Desconectado kotito

  • PIC10
  • *
  • Mensajes: 26
linea código con while
« en: 04 de Septiembre de 2019, 15:46:12 »
Hola.
Estudiando el código de un simple circuito de pic+lcd conectado en I2C me he topado con una línea que no sabría como interpretarlo.

Así contado rápido, en el código, se ve que tiene unas funciones para el I2C start, I2C stop, lcd_send_cmd, y demás funciones típicas en este tipo de conexión I2C.
Pues hay una función que es la siguiente:

En el código, si quiero representar "hola mundo", solo tengo que escribir en el main() del pic la siguiente línea: lcd_send_string ("Hello WORLD");
esta función me lleva a la siguiente:
Código: [Seleccionar]
void lcd_send_string (char *str)
{
while (*str) lcd_send_data (*str++);
}

y el while me lleva a

Código: [Seleccionar]
void lcd_send_data (unsigned char data)
{
unsigned char data_l, data_u;
data_l = (data<<4)&0xf0;  //select lower nibble by moving it to the upper nibble position
data_u = data&0xf0;  //select upper nibble

I2C_start();
I2C_write (SLAVE_ADDRESS_LCD);
I2C_write (data_u|0x0D);  //enable=1 and rs =1
I2C_write (data_u|0x09);  //enable=0 and rs =1

I2C_write (data_l|0x0D);  //enable =1 and rs =1
I2C_write (data_l|0x09);  //enable=0 and rs =1

I2C_stop();
}



mi duda es qué o cómo hace la función lcd_send_string(char *str)? ese while tan extraño es lo que me desconcierta porque no tiene la sintaxis while(condicion)
{
    haz algo
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7331
Re:linea código con while
« Respuesta #1 en: 04 de Septiembre de 2019, 16:04:59 »
Un string esta formado por los caracteres mas un caracter nulo ( 0x00 )

Código: C
  1. void lcd_send_string (char *str)
  2. {
  3.         while (*str) lcd_send_data (*str++);
  4. }

Esta funcione recibe un puntero, es decir a la indicador de donde se encuentra la primer letra de tu palabra... Ejemplo
Su pongamos que haces:

Código: C
  1. lcd_send_string ("Hola");

Y que "Hola" el compilador lo puso en la Flash, debido a que no cambia, y esta ubicado en la pocision 0x1000 de la FLASH, entonces en tu flash tendrias algo asi:

Direccion  de memoria  - Contenido
0x1000 - 'H'
0x1001 - 'o'
0x1002 - 'l'
0x1003 - 'a'
0x1004 - '\0'

Lo que vos le pasas a la funcion es el valor 0x1000. No todo el string, solo un indicado de donde esta alojado.

La funcion ahora si lcd_send_string realiza lo siguiente si lo escribo un poco mas claro:

Código: C
  1. while(*str)
  2. {
  3.     lcd_send_data(*str);
  4.     str++;
  5. }

Voy a hacer todos los pasos para que te des cuenta como es que funciona.
El while, pregunta que contenido hay en la direccion que da str... El unico caso que sea falso y salga del while es que el valor que apunta str sea 0x00, sino ejecuta el while. Dentro se envia envia la letra mediante lcd_send_data. Y finalmente se le dice que apunte a la direccion siguiente. Algo asi:

Primera vuelta (apenas entra)

str = 0x1000  -> *str = 'H'
Lo que esta dentro del while es distinto de 0, por lo tanto se considera como verdadero y ejecuta el while.
enviando la 'H' y incrementa str a 0x1001

Segunda vuelta:

str = 0x1001  -> *str = 'o'
Lo que esta dentro del while es distinto de 0, por lo tanto se considera como verdadero y ejecuta el while.
envia la 'o' y incrementa str a 0x1002

3ra:

str = 0x1002  -> *str = 'l'
Lo que esta dentro del while es distinto de 0, por lo tanto se considera como verdadero y ejecuta el while.
envia la 'l' y incrementa str a 0x1003

4ta:

str = 0x1003  -> *str = 'a'
Lo que esta dentro del while es distinto de 0, por lo tanto se considera como verdadero y ejecuta el while.
envia la 'a' y incrementa str a 0x1004

5ta:

str = 0x1004  -> *str = 0x00
El while se termina aca debido a que el contenido es 0.


Resumiendolo a todo lo que dije:

Envia caracter a caracter hasta encontrar un caracter nulo, donde sale del while.
Caracter nulo que el compilador C ya incorpora en una string y que es util justamente para determinar donde termina.

Desconectado kotito

  • PIC10
  • *
  • Mensajes: 26
Re:linea código con while
« Respuesta #2 en: 04 de Septiembre de 2019, 16:57:02 »
=O

Muchas gracias por la explicación y tu tiempo en dedicarle. Gracias mil. Se entendió perfectamente.

En primer lugar, al ver la linea, pensaba que estaba haciendo un casting con el (*str) dando por hecho de que la función devolvía algo. No sé por qué he pensado algo tan tonto como eso.

 :D :D


 

anything