Autor Tema: Array de strings, me funciona, pero deja de funcionar tras alargarse el programa  (Leído 1202 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Hola a todos. He estado usando arrays de strings delcarados de la siguiente forma: 

Código: C
  1. char *string_mes [13] = {" ","Enero\0","Febrero\0","Marzo   \0","Abril   \0","Mayo    \0","Junio   \0","Julio   \0","Agosto  \0","Septiemb\0","Octubre \0","Noviembr\0","Diciembr\0"}; // texto de los meses del año

 En principio esto me estaba funcionando perfectamente al llamarlos de la siguiente manera:

 
Código: C
  1. printf("%s",string_mes[mes]");

  Si la variable "mes = 2" por ejemplo, pues ese printf me saca (febrero) por el rs232. Hasta ahí todo perfecto, peeero.....

  El programa es grande, es un micro 18f26k20 y llevo ya consumido un 64% de program memory. 

   Se usan muchos printf con texto definido en los propios printf.

  Pues bien, llega un momento en que como ponga un solo "printf" más en mi código, los arrays de strings dejan de funcionar.

   el printf que he puesto arriba ya no saca "febrero" sino que no saca nada.

  Con que elimine un printf cualquiera, por ejemplo, uno que diga printf("hola");     ya vuelve a funcionar el array de strings.

   Creo que es algo relacionado con la memoria, pero aquí me pierdo...   ¿ alguna idea??

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Array de strings, me funciona, pero deja de funcionar tras alargarse el programa
« Respuesta #1 en: 26 de Agosto de 2017, 12:29:43 »
64% no deberia trabarte para nada lo que estas haciendo. Es imposible pensar que un printf + texto constante ocupe todo eso.

Respecto al array.
Tenes que pensar que ahí estas definiendo un array de punteros, son 13 punteros en memoria RAM, pero que su posicion inicial debe ser cargada en el inicio porque estan inicializados, asi que ocupan ademas espacio en la FLASH para inicializarlos. Si el compilador lo optimiza puede que esto no ocurra, si ocurre asi entonces pienso que podrias ahorrar haciendo algo como esto:

Código: C
  1. const char string_mes[12][9]

Y luego llamarlo desde string_mes[mes], en si opino que es lo mismo. Luego tenes para ahorrar otras cosas.
El mes 0 directamente quitarlo cualquier cosa utiliza [mes - 1] para usar los meses. El caracter nulo \0 esta demas, ya que un string "" le agrega por si solo el caracter nulo, es la forma de definir los string C.

Pero no deberias tener problemas con un PIC18F26K20, ya que las tablas permiten acceder a toda la flash sin ningun problema para poder leerla.

O es otro error.
O es problema del compilador.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Array de strings, me funciona, pero deja de funcionar tras alargarse el programa
« Respuesta #2 en: 26 de Agosto de 2017, 13:36:58 »
Madre mia KillerJc, que alegría. Pues vuelve a funcionar perfectamente definiendolo así como tu me lo indicas.

 Lo que no me deja indiferente es por qué antes funcionaba de la otra forma con los punteros hasta que ha llegado un momento en que no.  Supongo que por temas de optimización o al cruzarse determinadas páginas. Creo que tengo sobre un 98% de optimización.

  Pues en la flash directamente queda todo y así libero ram. aunque el consumo máximo de ram lo tenía en un 30%.

  Muchas gracias. Un saludo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Array de strings, me funciona, pero deja de funcionar tras alargarse el programa
« Respuesta #3 en: 26 de Agosto de 2017, 13:46:55 »
Realmente no se porque te hacia ese problema, hacerlo como lo estabas haciendo ( aunque mejor era definirlo como const al array) era tambien viable.
Cuando se lee la FLASH, se usa las  instrucciones TBLxxx quienes tiene registros para indicar la direccion de las cuales abarcan a toda la memoria, por lo cual leer algo de la flash no es problema, ya que no hay paginas ni nada por el estilo. En la RAM podes aplicar el mismo principio con los registros indirectos, por lo cual TAMPOCO deberia ser problema.

Lo unico que se me ocurre es que el compilador realiza algo que no debe. El problema que para detectar que es, imagino que se debe necesitar revisar bastante codigo.


 

anything