Autor Tema: Problema con variable  (Leído 1894 veces)

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

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Problema con variable
« en: 22 de Octubre de 2009, 12:51:17 »
Buenos días grupo, me sucede algo incomprensible para mi:
Configuro una variable de la siguiente manera:

Si configuro de esta forma, la variable resultado_ad no funciona bien, los valores se pierden

char   analogo[4];      //matriz de 4 variables
int16   resultado_ad;   //variable 16 bit

Si configuro de esta otra forma, la variable resultado_ad si funciona bien

int16   resultado_ad;   //variable 16 bit
char   analogo[4];      //matriz de 4 variables

Con las pruebas que hice veo que la variable siguiente a una matriz no funciona bien.

A alguien la ha pasado algo similar?

gracias.



Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con variable
« Respuesta #1 en: 22 de Octubre de 2009, 13:10:46 »
Hola, es probable que no funcione porque estés usando mal el índice de analogo[].

Un ejemplo del probable error...

Código: [Seleccionar]
char   analogo[4];      //matriz de 4 variables
int16   resultado_ad;   //variable 16 bit

//Ahora apuntamos erróneamente analogo[]
analogo[4] = 0xAB;

Al apuntar a la quinta posición no existente de análogo estás invadiendo un byte de los 2 bytes de resultado_ad, que están justamente después de los 4 chars.

Es decir, que estás modificando el byte alto de resultado_ad por apuntar mal analogo.

Ahora, de la otra forma que pones no falla porque si modificas el quinto byte no existente estarás modificando RAM no empleada por nada más. Resultado_ad fue ubicada antes de analogo[].

Con la poca información que das eso es lo que se me ocurre  ;-)

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema con variable
« Respuesta #2 en: 22 de Octubre de 2009, 13:29:06 »
Hola migsantiago, gracias por responderme

Yo creo que si se está invadiendo el primer registro de resultado_ad, pero no sé en que momento, esto ocurre cuando ejecuto esta instrucción:

sprintf(analogo,"%04lu",resultado_ad); // le estoy diciendo que el los 4 caracteres de análogo descomponga la variable resultado_ad

Ahora, cuando defino la variable
char   analogo[4];      //4 son las variables contenidas.

Esta es la fracción de código completo:

Código: [Seleccionar]
void msj_analogo1() //"RA0 = 0000  000%"
{
int i;

sprintf(analogo,"%04lu",resultado_ad);

display_4b(0 , 0x88); //Dirección donde se escribirá el mensaje
for(i=0;i<sizeof(analogo);i++) //Ciclo que envía el texto al LCD
{
display_4b(1 , analogo[i]);
}

i = ((int32)resultado_ad * 100) / 1024; //se calcula porcentaje
sprintf(analogo,"%03u%%",i);

display_4b(0 , 0x8e); //Dirección donde se escribirá el mensaje
for(i=0;i<sizeof(analogo);i++) //Ciclo que envía el texto al LCD
{
display_4b(1 , analogo[i]);
}
}

saludos.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con variable
« Respuesta #3 en: 22 de Octubre de 2009, 14:00:22 »
Debes agregar 1 elemento más a analogo debido a que sprintf agrega el carácter nulo '\0' para indicar finalización del string.

Saludos!
« Última modificación: 22 de Octubre de 2009, 15:41:13 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema con variable
« Respuesta #4 en: 22 de Octubre de 2009, 14:21:02 »
Hola Suky, casualmente probé haciendo lo que me estás indicando y efectivamente funciona, pero ahora comprendo la razón.

gracias.
saludos.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con variable
« Respuesta #5 en: 22 de Octubre de 2009, 14:21:16 »
El valor de resultado_ad va de 0 hasta 1023 por lo que necesitas 4 chars para escribirlo pero los strings necesitan de un char extra que indica dónde termina la información, es decir, que en el peor de los casos analogo debe ser de 5 elementos...

Código: [Seleccionar]
char analogo[5];
resultado_ad=1023;

sprintf(analogo, "%04lu", resultado_ad);

analogo queda:

analogo[0]='1';
analogo[1]='0';
analogo[2]='2';
analogo[3]='3';
analogo[4]=NULL; //Fin de cadena

Acá más detalles sobre el funcionamiento de cadenas.

http://www.todopic.com.ar/foros/index.php?topic=25785.msg210802#msg210802

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema con variable
« Respuesta #6 en: 22 de Octubre de 2009, 15:46:03 »
migsantiago, que excelente explicación, ideal para todos los que apenas nos iniciamos en el tema de PIC en lenguaje C.

migsantiago, abusando de tu conocimiento y luego de ofrecer disculpas al foro en general, quiero hacerte una pregunta que nada tiene que ver con PIC. ! si depronto sabes algo...!.
En flash (action Actionscript) se utiliza código C, hay forma de utilizar la librería string.h o si de alguna forma se puede utilizar la función "sprintf".

mil gracias y de nuevo disculpas.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con variable
« Respuesta #7 en: 22 de Octubre de 2009, 15:55:04 »
migsantiago, que excelente explicación, ideal para todos los que apenas nos iniciamos en el tema de PIC en lenguaje C.

migsantiago, abusando de tu conocimiento y luego de ofrecer disculpas al foro en general, quiero hacerte una pregunta que nada tiene que ver con PIC. ! si depronto sabes algo...!.
En flash (action Actionscript) se utiliza código C, hay forma de utilizar la librería string.h o si de alguna forma se puede utilizar la función "sprintf".

mil gracias y de nuevo disculpas.

De ninguna manera abusas de mi conocimiento sobre actionscript... no sé nada al respecto :D

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Problema con variable
« Respuesta #8 en: 22 de Octubre de 2009, 16:17:12 »
Es claro migsantiago, mil gracias.

Hasta pronto.