Voy a advertir sobre algo que ya me ha cansado con CCS, y que me ha fallado, desde la version 4.088(incluso puede ser desde antes, no lo recuerdo) hasta la 4.104 que es la que uso ahora.
Intentar utilizar un puntero de una estructura para recorrer un array de dicha estructura resulta en DESASTRE. El problema es bastante evidente. El CCS muchas veces, no acomoda los elementos del array de la estructura consecutivamente en la RAM. Esto hace que obviamente luego, al querer recorrerlos con un puntero, el puntero se ubique en posiciones de memoria que no corresponden a ningún elemento del array, generando estragos en la ejecución del programa.
Considerense advertidos...
Primero que nada este es mi primer posteo en el foro, aunque siempre lo segui muy de cerca por diversos motivos y siempre me sacaron del apuro sin necesidad de que posteara (usando el buscador, como corresponde). Perdón por resucitar el tema pero leyendo justo encontré algo similar a lo que me sucedió.
Volviendo un poquito mas atrás (perdón por eso), a al texto citado, escrito por BrunoF, quiero votar a favor del bug que encontró porque me parece que en una aplicación que estoy desarrollando (un generador de señales) me sucede que para un menú que genero para mostrar en un LCD de NOKIA 1100 genero una función para reutilizar código, ya que son muchas las posibilidades y los items de los menúes que pienso incluir. Con un botón (interrupción externa por RB0) se llama a la función menu(opc) que usa como parámetro un char global (o esa es la idea) donde se encuentran los nombres de los items a mostrar en el LCD, la función lo que hace es ubicar el "cursor" en el LCD y enviar a escribir el elemento sub-i de ese char. El programa es el siguiente:
char opc[7][15];
#INT_EXT NOCLEAR
void EXT_isr()
{
char opc[7][15]={"Tipo de onda","Frecuencia","Periodo","","","",""}; //VECTOR GLOBAL
while(!bit_test(PORT_B,0)){delay_us(200);}
disable_interrupts(INT_EXT1 && INT_EXT2);
clear_interrupt(INT_EXT);
menu(opc);
}
void menu(char opc)
{
int i;
disable_interrupts(INT_EXT);
disable_interrupts(INT_EXT1);
disable_interrupts(INT_EXT2);
lcd_clear();
gotoxy(0,0);
printf(print_char,">");
for(i=0;i<=6;i++)
{
gotoxy(10,i);
printf(print_char,opc[i]);
}
}
Se que por ahí no tiene punto de comparación pero este "mismo" (muy muy muy similar) pedacito de código lo usé unos años atrás para un proyecto hecho en Borland C, de cualquier manera debería funcionar.
Yendo al grano, lo que me sucede es que en "la vida real" no se escribe el menú, y en el proteus , observando el contenido del array pasan cosas muy raras, o hace referencia (como un puntero) a la primera letra del primer elemento (en este caso "T"), o a veces me genera la matriz de 7 x 15 pero cuando se hace el llamado a la función menu() el array char pierde todo su contenido y la matriz completa (o el puntero) queda con valores de caracter nulo: '\0'. Lo que me asombra de todo esto, es que la variable que yo defino es de tipo GLOBAL! no debería cambiarse (a no ser que reemplace los valores, supongo... por lo que tengo entendido).
La forma que encontré de solucionarlo es generando el vector char opc[7][15]={"Tipo de onda","Frecuencia","Periodo","","","",""}; (o lo que sea que le quiera mandar a escribir) de forma LOCAL dentro de cada función que requiera a su vez llamar a la función menu() y escriba lo que sea que este en su vector opc en el LCD. Ejemplo de código (QUE FUNCIONA PERFECTO):
#INT_EXT NOCLEAR
void EXT_isr()
{
while(!bit_test(PORT_B,0)){delay_us(200);}
output_toggle(PIN_C2);
disable_interrupts(INT_EXT1 && INT_EXT2);
clear_interrupt(INT_EXT);
menu();
}
void menu()
{
int i;
char opc[7][15]={"Estado","Tipo de onda","Amplitud","Frecuencia","Periodo","Duty cicle",""};
disable_interrupts(INT_EXT);
disable_interrupts(INT_EXT1);
disable_interrupts(INT_EXT2);
lcd_clear();
gotoxy(0,0);
printf(print_char,">");
for(i=0;i<=6;i++)
{
gotoxy(10,i);
printf(print_char,opc[i]);
}
}
Esos dos pedazos de código los probé para las versiones 4.093 (actual) y 4.130 (los peores errores imaginables) y para la simulación el Proteus versión 7.8 SP2 (probé la 7.10 SP0 y fué desastrosa su estabilidad). El PIC es un 18F4550 y creo que no me olvido de ningún dato más...
Gracias de antemano y espero le encontremos solución!