Autor Tema: Conversion de tipos (de float a entero)  (Leído 8540 veces)

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

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Conversion de tipos (de float a entero)
« en: 16 de Octubre de 2004, 08:06:00 »
Wenas a tod@s

Vereis tengo un problemilla y no se como solucionarlo, quiero comparar 2 variables una la tengo en la eeprom y es de tipo "unsigned int8" la llamaremos "temp_eeprom" y la otra es un "float" y la llamaremos "temperatura", bien, lo que pretendo hacer es una sentencia if...

if (temperatura >= temp_eeprom) { ..... }

edito: se me ha olvidado comentar, que el float es un número de 2 digitos enteros, y uno decimal (al menos es como se visualiza en el LCD), y de este solo me interesa su parte entera, para eso quiero hacer la conversión... lo mismo podría obtener la parte entera del float y meterlo en otra variable tipo int, pero aún asi tampoco se como hacerlo...

sabríais decirme como?

Gracias!

pd: oshow si lees esto... la variable float, es la del codigo del sht-11 que posteaste en el foro, que está dentro de una estructura y le asigna ".f" al final de la variable, en el caso de ser entero ".i" no llego a entender del todo pq y como se utiliza esto ...

Gracias a todos!

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Conversion de tipos (de float a entero)
« Respuesta #1 en: 16 de Octubre de 2004, 09:15:00 »
Prueba esto:

(temperatura >= (float)temp_eeprom) { ..... }

Esto lo que hace es tratar la variable int temp_eeprom como float en esa operación, que creo sería más correcto que hacerlo al revés.
En general, es así como se hace... poniendo el tipo al que quieres convertir entre paréntesis antes de la variable.

Saludos y suerte!!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Conversion de tipos (de float a entero)
« Respuesta #2 en: 16 de Octubre de 2004, 09:21:00 »
Si lo único que quieres es hacer if (temperatura >= temp_eeprom) { ..... }  no hay ningún problema en que una sea float y la otra int

De todas formas te digo como pasar la float a int: (int)temp

Un saludo

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: Conversion de tipos (de float a entero)
« Respuesta #3 en: 16 de Octubre de 2004, 10:03:00 »
Hola Venum.

A ver puedo equivocarme, pero creo que lo estás planteando mal, la conversión o el castig de variables, nunca se hace "hacia abajo" como planteas, se tiene que hacer "hacia arriba", es decir, en lugar de pasar un float a entero para poder compararlo, es mejor pasar el entero a float, porque sino perderías precisión (la parte decimal del float). Lo que tienes que hacer es convertir temp_eeprom a float y así poder comparar las variables sin problema alguno. (Tal y como te comentan mas arriba)

Para hacer el casting por ejemplo puedes hacer esto:

//creas una variable de tipo float
float variable1;

variable1=(float)temp_eeprom; //casting de entero a float.

En la variable1 ya tienes el float para poder compararlo y no perder precision (mucho mejor lo de cucaracha, que ya lo hace todo dentro del if y no define variable auxiliar alguna).



Pero bueno, de todos modos si no te convence lo que te he contado y lo que quieres es solo la parte entera y despreciar los
decimales, es muy facil, por ejemplo, truncando los decimales, como bien te dice Pocher, no tienes ningun problema en
comparar u operar con variables de distinto tipo ya que el compilador hace conversiones implicitas,mira el ejemplo:


Codigo:

#include <16f876.h>
#use delay(clock=4000000)
#include <lcd.c>



void main()
{

int a=2,c;
float b=2.5;


lcd_init();
   while(1)
      {
         lcd_putc("f");
         lcd_gotoxy(1,1);
        c=a+b;   //al hacer la suma se realiza una conversion o casting implicito.
         
         printf(lcd_putc,"%i",c);
         delay_ms(1000);
      }
}




Fijate que el resultado es 4 (pruebalo ya verás), o sea al hacer la suma y la asignacion, el compilador ya hace una conversión implicita y el resultado es un entero.

Si así no lo ves, quizás se vea mejor con una asignacion directamente, mira si ponemos una variable temporal al codigo de
antes:

Codigo:

#include <16f876.h>
#use delay(clock=4000000)
#include <lcd.c>



void main()
{

int a=2,c,temp;
float b=2.5;


lcd_init();
   while(1)
      {
         lcd_putc("f");
         lcd_gotoxy(1,1);
         temp=b;   //casting en la asignacion... se pierde precision
         c=a+temp;

         printf(lcd_putc,"%i",c);
         delay_ms(1000);
      }
}



Es facil no?.

 En cuanto a lo que me preguntas del código del sht11, bueno, solo tienes que recordar como se accede a cada miembro de una estructura.

Te lo resumo muchisiiiimo, en el código se va a hacer una conversión de entero a float, entonces se crea una estructura con
dos miembros, uno entero y otro float (sabes que para acceder al miembro de una estructura se utiliza el operador punto) entonces para hacer la conversión accede al miembro entero de la estructura " (float)temperatura.i " y una vez hecho el casting (o conversion ) se le asigna al miembro float de la estructura " temperatura.f " , no es más que una conversión de tipos de datos, pero para tenerlo "recogidito" lo hace con los miembros de una estructura en lugar de tener dos variables cualquieras sueltas por "ahí". Supongo que "máomeno" me habrás pillao no?. Buffff a veces me "enrollo" de una manera.... perdonar la extensión del mensaje.....


Un saludo y suerte, ese terrario te va a quedar de aúpa.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: Conversion de tipos (de float a entero)
« Respuesta #4 en: 16 de Octubre de 2004, 10:34:00 »
muchisisimas gracias a los 3

Voy a hacerlo como me ha comentado oshow ya que los decimales para hacer el termostato no me interesan, la visualización d la variable es de 1 decimal (23,1º, pero en el termostato de momento me conformo con la parte entera(23º.


Gracias de nuevo