Autor Tema: Función con cadenas inestable  (Leído 1626 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Función con cadenas inestable
« en: 06 de Octubre de 2017, 13:35:04 »
Buenas, tengo la siguiente función para escribir una cadena de caracteres en un LCD, me da problemas escribiendo caracteres erróneos en otras posiciones del LCD que no debería, lo solucioné con la segunda función, pero es un engorro andar contando los caracteres para poner el otro parámetro ¿alguna solución elegante?

Código: C
  1. void LCDprint(char * buff) {
  2.     while (*buff) {
  3.         LCD_PUTC(*(buff));
  4.         buff++;
  5.     }
  6. }

Esta soluciona el problema:

Código: C
  1. void LCDprint(char * buff, unsigned char len) {
  2.     unsigned char i;
  3.    
  4.     for (i = 0; i < len; i++) {
  5.         LCD_PUTC(*(buff++));
  6.     }
  7. }

Gracias!!! un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 257
Re:Función con cadenas inestable
« Respuesta #1 en: 06 de Octubre de 2017, 14:02:22 »
Yo siempre uso algo como esto

Código: C
  1. for(*str;*str !=0; *str++)
  2. {
  3. }


---
Código: C
  1. void LCDprint(char * buff) {
  2.     for(*buff;*buff !=0; *buff++)
  3.     {
  4.         LCD_PUTC(*buff);
  5.     }
  6. }

Si también te da problemas entonces es debido a que tus cadenas no tienen como terminación 0
« Última modificación: 06 de Octubre de 2017, 14:05:40 por tsk »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Función con cadenas inestable
« Respuesta #2 en: 06 de Octubre de 2017, 14:34:06 »
Yo siempre use la que estas usando micro_pepe, lo que me llama la atencion es esto:

Citar
me da problemas escribiendo caracteres erróneos en otras posiciones del LCD que no debería

El codigo C que pasaste que "tiene problemas", funciona correctamente, simulado y todo.

Código: C
  1. void LCDprint(const char * buff) {
  2.     while (*buff) {
  3.         LCD_PUTC(*buff++);
  4.     }
  5. }

Usandolo:

Código: C
  1. LCDprint("Hola");

Asi que pienso estoy seguro que el problema no sea esa parte del codigo que pasaste, y sea algo de LCD_PUTC, porque la diferencia entre este codigo y el pasado con el for es algun que otro ciclo mas, y podria llegar a ser problemas de tiempo.
« Última modificación: 06 de Octubre de 2017, 14:45:11 por KILLERJC »

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 257
Re:Función con cadenas inestable
« Respuesta #3 en: 06 de Octubre de 2017, 15:37:21 »

Asi que pienso estoy seguro que el problema no sea esa parte del codigo que pasaste, y sea algo de LCD_PUTC, porque la diferencia entre este codigo y el pasado con el for es algun que otro ciclo mas, y podria llegar a ser problemas de tiempo.

La forma más rápida de corroborar que es algo del LCD_PUTC es que agregue a todas sus cadenas un \0 al final.

Código: C
  1. LCDprint("Hola\0");

Porque

Citar
me da problemas escribiendo caracteres erróneos en otras posiciones del LCD que no debería

Puede tener dos significados, uno cuyo resultado es el que comentas, donde el LCD_PUTC tiene problemas o el otro que es que falta tener el \0 y estaría accediendo a áreas de memoria que no le pertenecen al buffer que contiene la cadena o que no pone el buffer en ceros antes de colocar otra cadena distinta. En ambos casos aparentaría ser inestable pero no sería un problema de la función LCD_PUTC.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Función con cadenas inestable
« Respuesta #4 en: 06 de Octubre de 2017, 17:23:00 »
Debí detallar un poco más  :oops:

Esto no da problemas:

Código: C
  1. LCDprint("Hola");

Lo que da problemas es esto:

Código: C
  1. char cadena[16];
  2. strcpy(cadena,"hola");
  3. LCDprint(cadena);

La cadena la defino de tamaño 16, pero luego no siempre se usan todos los caracteres. La forma de asignar los caracteres a la cadena se hace con una función que convierte un entero a char, le añade puntos decimales, borra ceros a la izquierda, etc...

Gracias!!! Un saludo.
« Última modificación: 06 de Octubre de 2017, 17:35:38 por micro_pepe »
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re:Función con cadenas inestable
« Respuesta #5 en: 06 de Octubre de 2017, 17:47:14 »

Asi que pienso estoy seguro que el problema no sea esa parte del codigo que pasaste, y sea algo de LCD_PUTC, porque la diferencia entre este codigo y el pasado con el for es algun que otro ciclo mas, y podria llegar a ser problemas de tiempo.

La forma más rápida de corroborar que es algo del LCD_PUTC es que agregue a todas sus cadenas un \0 al final.

Código: C
  1. LCDprint("Hola\0");

Porque

Citar
me da problemas escribiendo caracteres erróneos en otras posiciones del LCD que no debería

Puede tener dos significados, uno cuyo resultado es el que comentas, donde el LCD_PUTC tiene problemas o el otro que es que falta tener el \0 y estaría accediendo a áreas de memoria que no le pertenecen al buffer que contiene la cadena o que no pone el buffer en ceros antes de colocar otra cadena distinta. En ambos casos aparentaría ser inestable pero no sería un problema de la función LCD_PUTC.

Esto me ha dado la solución, esta es la función que separa un entero en caracteres:

Código: C
  1. void separa_digitos(unsigned int p_valor, char * digitos, unsigned char n_dig) {
  2.     //separa cada digito del 0 al 9, de p_valor, en unidades, decenas, etc...
  3.     //lo retorna en ASCII en digitos.
  4.     unsigned int valor;
  5.     valor = p_valor;
  6.     for (unsigned char i = 0; i < n_dig; i++) {
  7.         *(digitos + i) = (char) (valor % 10) + 48; //Se suma 48 para que almacene ASCII.
  8.         valor = valor / 10;
  9.     }
  10.     *(digitos + n_dig) = (char)'\0';
  11. }

Le añadí la línea final, y así funciona  ;-)

Saludos!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Función con cadenas inestable
« Respuesta #6 en: 06 de Octubre de 2017, 17:49:34 »
Bueno xD, escribi todo un texto, diciendo que:

- una razon era problema de otro parte del codigo que no le agrega el '\0', como dijo tsk
- Y otra es que el LCD_PUTC use el tiempo del for extra ese.

Pero bueno termino siendo la razon numero 1.


 

anything