TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: bitpic 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.
-
Que las variables seguramente no alberguen esos valores que dices.
Pastea el código
-
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.
-
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.
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. :?
-
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
-
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.
-
:-/ 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.
-
:-/ 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" :) :) :)
-
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
-
Es extraño, yo los he usado sin problemas. Si quieres pega aquí tu programa y lo revisamos.
-
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