Autor Tema: Pasar valores de un array de 3 a float  (Leído 2819 veces)

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

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Pasar valores de un array de 3 a float
« en: 04 de Enero de 2016, 21:20:34 »
Hola muchachos alguien me puede decir como puedo pasar los datos de un array que en este caso es de un indice de tres valores a un entero por ejemplo tengo el siguiente array:
array[3] en ellos con un ciclo for coloque tres valores 0AA, 0xBB y 0xCC, entonces esos valores pasarlos a una variable de tipo float
ya que como son tres valores no puedo usar un entero, y bueno que el valor de float me quede asi: float=AABBCC00 los ultimos cero serian el valor que no hace falta. Por lo que veo tengo que usar punteros obligatoriamente  :x y pues no quiero hacerlo pero si existe una forma mas sencilla de hacerlo mejor para mi. Gracias de antemano.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pasar valores de un array de 3 a float
« Respuesta #1 en: 04 de Enero de 2016, 23:12:16 »
Primero que nada un float no es un numero comun y corriente, CCS creo que usa lo mismo que MPLAB, ambos usan 24/32bits de float
Segun la IEEE 754 la representacion de un flotante de simple precision es :

1 bit de signo
8 bits de exponente
23 bits de mantisa

En ese orden, segun XC8/CCS que usan el mismo formato en 32 bits, suelen usar uno modificado que es de 24bits dado por

8 bits de exponente
1 bit de signo
15 bits de mantisa

Sin punteros pienso que tenes 2 opciones:

Una es usar una union

Código: C
  1. union _floatint {
  2.    float flotante;
  3.    short int array[4];
  4. } datos;
  5.  
  6. main(){
  7.  
  8.  datos.flotante = 0;  // Pongo a 0 como si fuera un flotante a esos 4 bytes
  9.  datos.array[1] = 0x22;  // Lo manejo como si fuera un array, ahora datos.flotante va a ser como vos queres 0x00220000
  10.  
  11. }

La otra que se me ocurre es:

Código: C
  1. float dato_float;
  2. short int array[3];
  3.  
  4. main() {
  5.  
  6.   dato_float = (float)(array[0]<<24 + array[1]<<16 + array[2]<<8)  
  7.  
  8. }

Sino con punteros... pero veo que no te gusta.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Pasar valores de un array de 3 a float
« Respuesta #2 en: 04 de Enero de 2016, 23:32:49 »
Gracias amigo bueno ahora mas tarde pruebo tu codigo haber si funciona. :x
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pasar valores de un array de 3 a float
« Respuesta #3 en: 05 de Enero de 2016, 04:24:09 »
Gracias amigo bueno ahora mas tarde pruebo tu codigo haber si funciona. :x

Ojo, que no di un codigo que funcione, sino una idea.. que es distinto. para que funcione tal ves tengas que cambiar algunas cosas.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Pasar valores de un array de 3 a float
« Respuesta #4 en: 05 de Enero de 2016, 18:06:53 »
Bueno yo lo que quiero hacer es lo siguiente:
void main(){
while (true){
int32 dato;
char datos[3]={0xEE,0xDD,0xFF};
dato=datos[0];datos[1];datos[2];
delay_ms(1000);
      }
}

en entero de 32 me gustaria pasarle los datos del array y quedaran asi 0x00EEDDFF si me entiendes mi amigo.KILLERJC
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pasar valores de un array de 3 a float
« Respuesta #5 en: 05 de Enero de 2016, 18:24:28 »
de 3 enteros de 8bits a entero de 32bits ?

uint8_t datos[3];
uint32_t dato32;

dato32 = array[0]<<24 + array[1]<<16 + array[2]<<8;


O lo mismo se aplica a la union...

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re:Pasar valores de un array de 3 a float
« Respuesta #6 en: 05 de Enero de 2016, 19:23:31 »
de 3 enteros de 8bits a entero de 32bits ?

uint8_t datos[3];
uint32_t dato32;

dato32 = array[0]<<24 + array[1]<<16 + array[2]<<8;


O lo mismo se aplica a la union...

La forma en que haces esos corrimientos le va a dar 0xEEDDFF00, no el numero que quiere obtener :  0x00EEDDFF

Para eso debero hacer:

Código: C
  1. dato32 = array[0]<<16 + array[1]<<8 + array[2];
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Pasar valores de un array de 3 a float
« Respuesta #7 en: 05 de Enero de 2016, 20:05:42 »
La forma en que haces esos corrimientos le va a dar 0xEEDDFF00, no el numero que quiere obtener :  0x00EEDDFF

Ese es un tema que no esta muy claro, en su primer post puso:

Citar
array[3] en ellos con un ciclo for coloque tres valores 0AA, 0xBB y 0xCC, entonces esos valores pasarlos a una variable de tipo float
ya que como son tres valores no puedo usar un entero, y bueno que el valor de float me quede asi: float=AABBCC00

De lo que se entiende teniendo 0xAA,0xBB,0xCC termina en 0xAABBCC00 y no 0x00AABBCC, por eso los valores de los shifts

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re:Pasar valores de un array de 3 a float
« Respuesta #8 en: 05 de Enero de 2016, 20:21:28 »
Si claro como no  :D
Cargar array a float

Código: [Seleccionar]
void main()
{
   int i, arr[]= {0xaa, 0xbb, 0xcc};
   float dato;
   int *ptr;
   
   ptr= &dato;
   
   for(i=0 ; i<4; i++)
     *ptr++ = arr[i];
     
   delay_ms(100);
   while(true);
}

Nota: la variable dato esta almacenada en la direccion 0x09



Saludos
« Última modificación: 05 de Enero de 2016, 20:30:50 por RALF2 »

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Pasar valores de un array de 3 a float
« Respuesta #9 en: 05 de Enero de 2016, 20:33:52 »
Gracias amigo bueno fue un error de mi parte pero creo que aqui estamos para aprender y de los errores se aprende mas de igual manera muchas gracias a todos por su ayuda. :-/ :D ((:-))  El codigo de KILLERJC no me trabajo no se porque pero el de RALF2 si pero con la diferencia que uso punteros y pues queria evirtar eso pero de todas maneras gracias y pues si existe la forma mas sencilla sin utilizar punteros pues bienvenida sera, gracias nuevamente amigos.
« Última modificación: 05 de Enero de 2016, 21:02:31 por Carlos2302 »
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re:Pasar valores de un array de 3 a float
« Respuesta #10 en: 05 de Enero de 2016, 21:22:00 »
Podrias tambien utilizar como te comentaron uniones asi:

Código: [Seleccionar]
void main()
{
   int i;
   
   union
   {
      int arr[3];
      float dato;
   }var;
   
   for(i=0; i<4; i++)
      var.arr[i]= i+10;   
     
   delay_ms(100);
   while(true);
}
De esa manera se carga en el float, los valores cargados en el array

Con identicos resultados  :mrgreen:

Saludos