Autor Tema: Problemas con int32  (Leído 5177 veces)

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

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Problemas con int32
« en: 04 de Febrero de 2007, 14:10:49 »
Hola tengo un problema que seguro que es alguna tonteria pero no me deja hacer una suma entre dos int32.

Tengo:

int32 len, a_len;

a_len despues de un trozo de codigo que tengo vale 2 y len despues de otro trozo de codigo vale 50.

El problema es que cuando hago:

a_len=a_len+len;

el resultado deberia ser 52 pero me da 250. Parece que con la funcion + en vez de sumar añada datos.


¿Alguien sabe a que se debe este problema?  :lol:

Gracias. Un saludo.
BitPIC

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Problemas con int32
« Respuesta #1 en: 04 de Febrero de 2007, 14:14:40 »
Que las variables seguramente no alberguen esos valores que dices.
Pastea el código

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas con int32
« Respuesta #2 en: 04 de Febrero de 2007, 14:17:11 »
bitpic, seria importante que aclares que compilador usas y si eso lo haces con variables globales  o variables que sean locales. 

Tal vez reusaste el nombre de las variables y tienen otro valor al ingresar a la sección donde haces el cálculo.

Tal vez "len" sea una posición de memoria reservada por tu compilador y que esté actualizándose por otra causa.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problemas con int32
« Respuesta #3 en: 04 de Febrero de 2007, 19:21:20 »
Perdonad por no haber aclarado algunas cosas.
Utilizo el CCS v4.018
Son variables globales y el codigo no lo habia puesto por que es un poco largo y pensaba que igual seria un poco engorroso.

Código: [Seleccionar]
char A_tam[11], B_tam[11];
int32 a_len,b_len,len;
int8 e,barra=92; // "\" = 92 decimal
//Inicio de la targeta SD
void SD_init(void)
{
//////////Borrado de memorias
   for(i=0;i<150;i++){
     data_in[i]=" ";
   }
   for(i=0;i<11;i++){
     A_tam[i]=" ";
   }
   for(i=0;i<11;i++){
     B_tam[i]=" ";
   }
///////////////////////////     
   fprintf(SD,"\r\r");
   delay_ms(500);
   
   fprintf(SD,"i %cDAA%cA.TXT\r"barra,barra);
   
   for(i=0;i<36;i++){
     data_in[i]=fgetc(SD);
   }
     
   for(i=0;i<11;i++){
      A_tam[i]=data_in[i+17];
   }
   
   for(i=0;i<150;i++){
     data_in[i]=" ";
   }
   
   fprintf(SD,"i %cDAA%cB.TXT\r"barra,barra);
   
   for(i=0;i<36;i++){
     data_in[i]=fgetc(SD);
   }
   
   for(i=0;i<11;i++){
      B_tam[i]=data_in[i+17];
   }
   
}

void SD_leer(void)
{
   for(i=0;i<150;i++){
     data_in[i]="&";
   }
   
   fprintf(SD,"q\r");
   delay_ms(500);
   fprintf(SD,"or #1 %cDAA%cA.TXT\r"barra,barra);
   delay_ms(500);
   fprintf(SD,"r #1\r");
   
   for(i=0;i<52;i++){
     data_in[i]=getc(SD);
   }
   
   for(i=0;i<52;i++){
      if(data_in[i]!='&'){
        fprintf(BLUETOOTH,"%c"data_in[i]);
      }
      else{
         break;
      }
   }
}

//maximo numero para un int32 = 4.294.967.296
//Conversion de A_tam y B_tam a su correspondiente numero char->int32
void SD_conver(void)
{
  a_len=0;
  b_len=0;
 
  a=0;
  for(i=0;i<11;i++){
      if(A_tam[i]!=' '){
         a++;
      }   
  }
 
  for(i=10;i>(10-a);i--){
     len=0;
     len=(A_tam[i]-30);
     for(e=0;e<(10-i);e++){
        len=len*10;
     }
     a_len=a_len+len;
  }   
   
}

El problema surge en SD_conver, esta rutina intenta convertir los caracteres que se encuentran en A_tam[] en un int a_len.

Estas variables solo se usan aqui. Lo unico que hago en el programa principal que no lo he metido aqui por que tambien es muy largo es mostrarlo en pantalla. El problema tiene que estar dentro de SD_conver y creo que podria ser algo relacionado con el int32 porque me lo he estado repasando y creo que tendria que funcionar.  :?
BitPIC

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problemas con int32
« Respuesta #4 en: 04 de Febrero de 2007, 19:30:07 »
Voy a aclararlo un poco mas porque despues de leerlo puede que alguien no entienda como funciona.

Creo que el problema tiene que estar en este bucle:

for(i=10;i>(10-a);i--){
     len=0;
     len=(A_tam-30);
     for(e=0;e<(10-i);e++){
        len=len*10;
     }
     a_len=a_len+len;
  }   

Lo que intento aqui es lo siguiente, en A_tam tengo un numero en caracteres ASCII que puedes ser de 1 a 10 caracteres.
Los numeros de 0..9 en ASCII son equivalentes a 30..39 en dec por eso resto 30 para saber que numero es y luego el bucle for interno lo que hace es multiplicar tantas veces por 10 como la posicion donde se encuentra el numero (unidades, decenas x10, centenas x10x10, etc.)
Luego en a_len voy acumulando los resultados que voy obteniendo.

Ejemplo: ASCII->521

1+20+500= 521   ->   lo que realmetne obtengo   ->   1+20+500=120500
« Última modificación: 04 de Febrero de 2007, 19:32:34 por bitpic »
BitPIC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas con int32
« Respuesta #5 en: 04 de Febrero de 2007, 22:18:37 »
Antes de leer todo tu código, revisa lo siguiente.

Los numeros de 0..9 en ASCII son equivalentes a 30..39 en dec por eso resto 30 para saber que numero es

Es un error, los números 0..9 en ASCII son equivalentes a 0x30 a 0x39 en HEXA o bien 48 a 57   en dec.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado bitpic

  • PIC18
  • ****
  • Mensajes: 402
    • BitPIC
Re: Problemas con int32
« Respuesta #6 en: 05 de Febrero de 2007, 05:31:32 »
 :-/ Maunix tienes toda la razon del mundo, me he despistado  :D , el programa va perfecto jjejejje me habia fijado en la tabla hex en vez de la dec para hacer la operacion. :?

Muchas gracias.

Un saludo.
BitPIC

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas con int32
« Respuesta #7 en: 05 de Febrero de 2007, 18:04:24 »
:-/ Maunix tienes toda la razon del mundo, me he despistado  :D , el programa va perfecto jjejejje me habia fijado en la tabla hex en vez de la dec para hacer la operacion. :?

Muchas gracias.

Un saludo.

Como dice un amigo "pasa hasta en las mejores familias" :) :) :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado perry

  • PIC10
  • *
  • Mensajes: 12
Re: Problemas con int32
« Respuesta #8 en: 07 de Marzo de 2007, 13:26:57 »
Hola!!!

Aprovecho este tema para exponer un problema que tengo con el compilador ccs. La cosa es que utilizo unavariable global que no me cabe en 16 bits, así que uso la directiva int32 para definirla y cuando ejecuto el programa y observo su valor compruebo que sólo se modifican los 4bytes más significativos y el resto se queda en cero todo el rato. Además observo que realmente en la memoria sólo ocupa 2 byites, es decir, que no me la difine como de 32 bits ¿alguien sabe a que se debe esto?según el manual si que puedo usar esa forma de definirlo pero luego no me lo reconoce.¿podría usar alguna otra alternativa?

muchas gracias :P

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problemas con int32
« Respuesta #9 en: 11 de Marzo de 2007, 02:47:08 »
Es extraño, yo los he usado sin problemas. Si quieres pega aquí tu programa y lo revisamos.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas con int32
« Respuesta #10 en: 11 de Marzo de 2007, 16:01:53 »
Perry, tu post me parece algo contradictorio

Aprovecho este tema para exponer un problema que tengo con el compilador ccs. La cosa es que utilizo unavariable global que no me cabe en 16 bits, así que uso la directiva int32 para definirla y cuando ejecuto el programa y observo su valor compruebo que sólo se modifican los 4bytes más significativos y el resto se queda en cero todo el rato.

Aquí dices que se modifican los 4 bytes más significativos.  Bueno, es razonable si una variable es int32 está compuesta por 4 bytes , lo cual si lo quieres ver de cierta forma, serían sus 4 bytes más significativos ;)

Además observo que realmente en la memoria sólo ocupa 2 byites, es decir, que no me la difine como de 32 bits ¿alguien sabe a que se debe esto?según el manual si que puedo usar esa forma de definirlo pero luego no me lo reconoce.¿podría usar alguna otra alternativa?
Y aquí es donde el dilema aparece. 

1. ¿Dónde ves que solo se modifican los 4 bytes más significativos?
2. ¿Porqué dices que ocupa solo 2 bytes?
3. ¿Cómo sabes que solo ocupa 2 bytes? 
4. ¿Has revisado de que NO sea una variable que definas en muchos lados?
5. Cómo dice Manolo, si estas preguntas no tienen respuesta, intenta subir el código. Si es muy extenso hazlo en un .zip

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything