Autor Tema: Problema con tipos de datos  (Leído 1328 veces)

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

Desconectado Shermie

  • PIC10
  • *
  • Mensajes: 2
Problema con tipos de datos
« en: 11 de Agosto de 2009, 05:12:37 »
Hola a todos, aunque ya llevo tiempo registrada, éste es mi primer hilo pidiendo ayuda.

He intentado usar la búsqueda, otras veces sí que he resuelto así problemas, pero hoy no hay modo.  :undecided:



Estoy realizando un programa en C, usando el compilador de CCS y viendo los resultados mediante proteus. 

Deseo que me saque por puerto valores RGB, entre 0 y 255 mediante una modulación software de pulso. Al principio, yo le enviaba desde una aplicación valores entre 0 y 255, y veía los resultados correctos.

Ahora lo que me interesa es mandar los valores como Tono y Brillo, y que esos dos parámetros me den los tres valores RGB que necesito. La función está bien hecha, ya que la he probado con otros lenguajes, pero creo que aquí tengo algún tipo de problema con los tipos de datos.


Tono y Brillo los he declarado como 'int8', y son valores que envío entre 0 y 255. ¿Cómo declaro 'Rojob', 'Verdeb' y 'Azulb'? He probado con int8 también, con long, con float, y no hay modo.

Dejo aquí un trozo de la función, en el primer caso, Rojob y Azulb saldrían como valores correctos, pero en Verdeb sólo salen valores cercanos a 0. En el segundo caso, el problema es con el Rojob. Y así con el resto.

He probado añadiendo (int) y llenándolo de paréntesis, pero tampoco.

Código: [Seleccionar]
void CambiarColor()
{
If ((43 > Tono) && (Tono >= 0)) //0º-60º
{
            Rojob = Brillo; //255 si el brillo está al 100% (=255)
            Azulb = 0;
            Verdeb =(int) (Tono * Brillo / 43);

}
        If ((86 > Tono) && ( Tono >= 43)) //60º-120º
         {
            Verdeb = Brillo;
            Azulb = 0;
            Rojob =(int)((Brillo - ((Tono - 43) * Brillo) )/ 43);

//ETC.

}



Muchas gracias ya de antemano y pido disculpas por mis pésimas explicaciones!


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema con tipos de datos
« Respuesta #1 en: 11 de Agosto de 2009, 05:21:44 »
No nos dices qué tipo de datos son Tono y Brillo, ¿bytes?, ¿words?

En el supuesto de que sean bytes, creo que tu función podría funcionar si haces cast, así:

Verdeb =(int) ((long)Tono * (long)Brillo / 43);


Rojob =(int)((Brillo - (((long)Tono - 43) * (long)Brillo) )/ 43);

El problema es que al multiplicar dos bytes, el resultado es mayor que un byte y desborda.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema con tipos de datos
« Respuesta #2 en: 11 de Agosto de 2009, 05:26:48 »
¿Tienes valores intermedios que pasen de 8 bits?

Si multiplicas A=100 * B=100 y despues divides por 100 aunque todos estos valores estén dentro del rango de 0 a 255 obtienes un valor intermedio que lo sobrepasa.

Tendrías entonces que hacer que las variables de cálculo fuesen int16 aunque el resultado final sea de solo 8 bits. Para obtenerlo utiliza el cast de int16 para los operandos y el de int8 para el resultado.


P.D.: Don Nocturno "me se ha adelantao".
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Shermie

  • PIC10
  • *
  • Mensajes: 2
Re: Problema con tipos de datos
« Respuesta #3 en: 11 de Agosto de 2009, 05:30:24 »
Muchas gracias por las respuestas!

Sí, evidentemente era que se desbordaba, pensaba que al declarar rojob y demás como int16 o añandiendo el (int) lo solucionaría, pero ya he visto que no (aun me queda muchísimo por aprender).

Ahora estoy haciendo pruebas con la función de Nocturno y parece que todo funciona perfecto.


 

anything