Autor Tema: Bugs en CCS 3.249  (Leído 1788 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Bugs en CCS 3.249
« en: 23 de Abril de 2006, 12:42:47 »
1) En el  Project/New/Pic Wizard  no aparecen los fuses...

2) en el siguiente codigo:
Código: C#
  1. #include "C:\Documents and Settings\Ernesto Alvarez\Mis documentos\error.h"
  2.  
  3. byte cantidad[4]={1,2,3,4};
  4. int16 modulo;
  5. int16 unidad;
  6. int16 decena;
  7. int32 centena;
  8. int16 millar;
  9.  
  10. void main() {
  11.  
  12.    unidad  = cantidad[0];         // Resultado: unidad  = 1
  13.    decena  = 10*cantidad[1];      // Resultado: decena  = 20
  14.    centena = 100*cantidad[2];     // Resultado: centena = 44 ???
  15.  
  16.    //Forma alternativa
  17.    centena = 1000*cantidad[2]/10; //Resultado: centena = 300
  18.   //Otra forma alterna
  19.    centena = cantidad[2];         //Resultado: centena = 3  
  20.    centena = 100*centena;         //Resultado: centena = 300
  21.  
  22.    millar  = 1000*cantidad[3];    //Resultado: millar  = 4000
  23. }

cuando se multiplica por 100 el resultado es erroneo del numero 3 en adelante dando los siguientes resultados:
0*100 = 0
1*100 = 100
2*100 = 200
3*100 = 44
4*100 = 144
5*100 = 244
6*100 = 88
7*100 = 188
8*100 = 32
9*100 = 132


si se hace en las formas alternativas que se muestran, el calculo funciona bien.


Lamentable...


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Bugs en CCS 3.249
« Respuesta #1 en: 23 de Abril de 2006, 13:01:41 »
Creo que el problema es que si multiplicas byte * byte, él lo intenta encajar en un byte, aunque la variable receptora sea un int16 o int32.
Por eso al multiplicar por 1000, ya te lo hace bien.

Esta opción quizás funcione:
 centena = (int16)100*(int16)cantidad[2];

Y esta también:
 int16 cantidad[4]={1,2,3,4};

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Bugs en CCS 3.249
« Respuesta #2 en: 23 de Abril de 2006, 13:04:14 »
con int16 cantidad[4]={1,2,3,4};  da 256  en lugar de 300

con
centena = (int16)100*(int16)cantidad[2];  si funciona..

pero.. ¿porque solo pasa cuando se multiplica por 100 y solo a partir del numero 3?
« Última modificación: 23 de Abril de 2006, 20:36:09 por Duende_Azul »

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Bugs en CCS 3.249
« Respuesta #3 en: 23 de Abril de 2006, 13:32:54 »
borro lo q he 'soltado' antes... me pasa por no leer bien jjeje... es raro el fallo, parece q reserva mal el espacio en la RAM para operar, por eso se te desborda 256+44 = 300...

prueba con esto...

Código: [Seleccionar]
int16 cantidad[4]={1,2,3,4};
int16 modulo;
int16 unidad;
int16 decena;
int16 centena;
int16 millar;

void main() {

  unidad  = cantidad[0];
  decena  = cantidad[1]*10;
  centena = cantidad[2]*100;
  millar  = cantidad[3]*1000;

Ahora la primera variable es la que debería indicar el espacio a reservar en la RAM para la operación...

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Bugs en CCS 3.249
« Respuesta #4 en: 23 de Abril de 2006, 20:48:31 »
pues, el poner el 100 al principio o al final es irrelevante, pero si en lugar de definir el vector como byte lo defino como int16 como han dicho, si funciona...

Ahora..  ¿no les parece que es un error del compilador? o yo estoy mas pelao que plátano en mano de mono?
En el vector cantidad[4] solo voy a almacenar un numero entre 0 y 9  y ocupar 2 bytes para eso me parece un desperdicio, por otro lado, que solo falle en una situación muy particular y no siempre, no se, lo veo medio raro..

Lo otro que necesito saber es si les aparecen los fuses cuando usan el pic-wizar...

gracias por su tiempo chicos...   :-)


PD: No se porque pero en la tarde con int16 cantidad[4];centena = 100*cantidad[2] me daba 256 pero ahora da el valor correcto  :x  me voy a dormir, tal vez sea eso...
« Última modificación: 23 de Abril de 2006, 20:55:37 por Duende_Azul »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Bugs en CCS 3.249
« Respuesta #5 en: 24 de Abril de 2006, 01:53:35 »
Si no quieres reservar más memoria de la necesaria, lo cual es un desperdicio inneceario, utiliza la conversión directa - operador cast () - como te indicaba antes:
centena = (int16)100*(int16)cantidad[2];

No me parece un error del compilador, creo que está diseñado así intencionadamente. Sólo que hay que saberlo a la hora de realizar operaciones.

¿Porqué falla sólo al multiplicar por centenas?. Pues es obvio, porque es la única operación que puede superar, y de hecho supera, la cantidad de 255 unidades, cantidad máxima representable por un byte.