TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: fastyx2 en 12 de Julio de 2007, 15:56:41

Título: comparacion de variables de distinto tipo
Publicado por: fastyx2 en 12 de Julio de 2007, 15:56:41
Amigos : estoy teniendo un fallo en un circuito que hice de control de temperatura con una sonda tipo lm35 entrando por el adc del pic.

mi pregunta concreta es si esta expresion puede traeme resultados inciertos ( ejemplo 1999 grados de presentacion de display )

if (  med_actual( ) < tempe_mod2 - 1 ) // si se esta enfriando ...     // med_actual () es float y tempe_mod2 es un entero de 8


desde ya gracias!!
Título: Re: comparacion de variables de distinto tipo
Publicado por: Nocturno en 12 de Julio de 2007, 16:20:15
Puedes hacer un "cast" a la variable antes de comparar:
if (  med_actual( ) < (float)tempe_mod2 - 1 ) // si se esta enfriando ...   

Puedes leer sobre cast aquí
http://acm.asoc.fi.upm.es/documentacion/c2007/manual/node6.html
Título: Re: comparacion de variables de distinto tipo
Publicado por: fastyx2 en 12 de Julio de 2007, 16:27:08
gracias por contestar!

lo voy a hacer , ahora mi pregunta es si la falta del cast puede ocasionar resultados inciertos o aleatorios
Título: Re: comparacion de variables de distinto tipo
Publicado por: Nocturno en 12 de Julio de 2007, 16:30:31
No sé en tu caso, pero yo me he llevado muchas desagradables sorpresas por operar con distintos tipos de variables.
Título: Re: comparacion de variables de distinto tipo
Publicado por: maunix en 12 de Julio de 2007, 16:50:05
lo voy a hacer , ahora mi pregunta es si la falta del cast puede ocasionar resultados inciertos o aleatorios

Un definitivo SI.

De hecho, creo que también debieras agregar (float) al 1


if (  med_actual( ) < (float)tempe_mod2 - (float) 1 )


Saludos
Título: Re: comparacion de variables de distinto tipo
Publicado por: fastyx2 en 12 de Julio de 2007, 19:43:11
ok gracias , lo del 1 no lo habia notado.

pregunta: si quiero promover el resultado en entero , cuando paso el float a entero ,  como lo corta?( que hace con 2,27 por ejemplo )

desde ya gracias!
Título: Re: comparacion de variables de distinto tipo
Publicado por: maunix en 12 de Julio de 2007, 20:12:32
ok gracias , lo del 1 no lo habia notado.

pregunta: si quiero promover el resultado en entero , cuando paso el float a entero ,  como lo corta?( que hace con 2,27 por ejemplo )

desde ya gracias!

Creo que eso no te lo hará el compilador, al menos no que yo sepa. Es que directamente jamás se me ocurrió probarlo

Debes buscar alguna función que convierta de float a entero.  No es lo mismo 'castear' que 'convertir'.

El casteo es algo fijo , siempre igual, que trata con cosas que tienen que ver con cómo almacenará la información.

El pasar de float a entero, es completamente dependiente del exponente. 
Título: Re: comparacion de variables de distinto tipo
Publicado por: fastyx2 en 12 de Julio de 2007, 20:47:34
es verdad lo que decis Maunix , yo me referia a que cuando haces la promocion hacia entero del float con el casting , que es lo que pasa con la parte decimal , si la redondea hacia abajo , hacia arriba o no se que otra cosa...
Título: Re: comparacion de variables de distinto tipo
Publicado por: jfh900 en 12 de Julio de 2007, 20:51:17
Al convertir un float en entero, se trunca la parte decimal.

Un saludo
Título: Re: comparacion de variables de distinto tipo
Publicado por: fastyx2 en 12 de Julio de 2007, 23:53:57
gracias jfh900!
Título: Re: comparacion de variables de distinto tipo
Publicado por: Nocturno en 13 de Julio de 2007, 01:34:48
De hecho, creo que también debieras agregar (float) al 1


if (  med_actual( ) < (float)tempe_mod2 - (float) 1 )


Otra forma de hacerlo es escribir el 1 directamente en formato float:

if (  med_actual( ) < (float)tempe_mod2 - 1.0 )

Título: Re: comparacion de variables de distinto tipo
Publicado por: maunix en 13 de Julio de 2007, 08:37:22
es verdad lo que decis Maunix , yo me referia a que cuando haces la promocion hacia entero del float con el casting , que es lo que pasa con la parte decimal , si la redondea hacia abajo , hacia arriba o no se que otra cosa...

A pesar de que ya te han respondido, te pido consideres lo siguiente: un casteo, no es más que formatear una variable de una a otra. Es decir, un char lo casteamos en integer, un integer en un float.  El proceso queda 'fijo' en el código y por ende no se lo modifica. 

Esas rutinas, no saben qué valor tendrán las variables, simplemente transforman su resultado y por ende siempre truncan.  No se meten con redondeos y esas cosas, porque ya no hablaríamos de un 'casteo' sino de una función diferente.

Saludos

Manolo, confieso que lo uso así como tu lo pusiste en mis códigos, pero la verdad no se me ocurrió cuando puse mi ejemplo  :D :D , y la verdad que hacía falta que lo ponga alguien porque es la forma más simple.  :mrgreen: :mrgreen:
Título: Re: comparacion de variables de distinto tipo
Publicado por: fastyx2 en 13 de Julio de 2007, 11:53:04
les agradezco a todos por la contestación!

por una cuestion de velocidad del micro y porque lo puedo hacer voy a promover la variable float a entero y hacer la comparación. no tengo problema con la parte decimal para que prendan o apaguen los equipos de calefaccion o refrigeracion , por eso puedo truncar el float , pero en la presentacion del display si coloco el valor
del float.
Título: Re: comparacion de variables de distinto tipo
Publicado por: PalitroqueZ en 13 de Julio de 2007, 13:27:09
ya entiendo a que se refieren cuando se habla de 'cast' , yo había usado ese operador y ahora es que me doy cuenta que tiene nombre