Problema Acceso Memoria

Buenas,

Hace unos meses cree un post comentando problemas con una pantalla tft para un proyectito que tengo. El caso que estoy generando una librería para facilitar la creación de las diferentes interfaces de usuario y me estoy topando con un problemilla de acceso de memoria.

Os muestro el pedazo de código que me da problemas.

typedef struct  {
    String text; 
   int font = 0;
   int coord[2] = {10, 0};
}ScreenLine;

typedef struct  {
    int size;
    ScreenLine* lines;
}ScreenLines;

ScreenLines defineTexts (int DisplayNumber) {
   ScreenLines ScreenTexts;
  Serial.println("defineTexts::Definiendo Textos");
  
  if (DisplayNumber == 0) { 
  // lines = (ScreenLine*) malloc(5 * sizeof(ScreenLine));
    ScreenTexts.lines = new ScreenLine[5];
    ScreenTexts.lines[0].text = "La sonda marca la temparatura actual"; 
    ScreenTexts.lines[1].text = "Para comenzar el cambio de agua pulse";
    ScreenTexts.lines[2].text = "continuar";
    ScreenTexts.lines[3].text =  "Recuerde que se tomara la temperatur";
    ScreenTexts.lines[4].text =  "actual como referencia";
    ScreenTexts.lines[5].text = "Temp. Actual: ";
    ScreenTexts.lines[5].font = 1;
    ScreenTexts.lines[5].coord[1] = 60;
    Serial.println("defineTexts::textos cargados");
    
    ScreenTexts.size =5;
    return ScreenTexts;
  }
 
void loadScreens()
{

  //********PANTALLA 1********//
  ScreenLines ScreenTexts = defineTexts(0);

    Serial.println("TEXTO");
  Serial.println(ScreenTexts.lines[0].text);
}
}

Os pongo un poco en contexto, la parte que podéis ver tiene como objetivo definir los textos de las diferentes pantallas (antes lo estaba haciendo línea a línea). El caso es que los textos llegan a definirse y incluso la línea (Serial.println(ScreenTexts.lines[0].text)) llega a mostrarlo en el serial pero a partir de ahí casca y no continua con la ejecución.

Tengo unas clases (screens, bodyScreens, bodyPopup) que se encargan de almacenar y gestionar la interfaces de usuarios. La intención del pedazo de código de arriba es lo que comentaba anteriormente, ordenarlo un poco y no tener que ir línea a línea a la hora de crear la pantalla. Podríais echarme una mano?

Gracias de antemano. Un saludo.

En una mirada muy rápida te comento que revise la dimensión del array:

ScreenTexts.lines = new ScreenLine[5];

No puede acceder a

 ScreenTexts.lines[5].text = "Temp. Actual: ";
    ScreenTexts.lines[5].font = 1;
    ScreenTexts.lines[5].coord[1] = 60;

Dado que el array va de 0 a 4...

Jodeeer... las prisas, como sea eso es para matarme, pruebo a ver.

Menudo patán!!! Pues efectivamente era eso.

Ya que estoy os voy a plantear una duda. Estoy guardando el tamaño del array en la propiedad size. Se puede determinar el tamaño del array a partir del puntero y evitar guardar dicho tamaño.

Algo como esto int size = sizeof(( ScreenTexts.lines)) / sizeof(ScreenTexts.lines[0]);

Por la web recomiendan no usarlo. Podríais darme algo de info al respecto.

Mil gracias de antemano!

Si es una constante, úsala definiendo "const" o un "define"
en vez de:

ScreenTexts.lines = new ScreenLine[5];

puedes usar:

#define CLINEAS 5
ScreenTexts.lines = new ScreenLine[CLINEAS];

O algo así....
Saludos.

En este caso si sería constante, pero depende de las líneas a pintar en la pantalla por eso mi duda de calcularlo en lugar de definirlo, pero bueno, voy tirando con eso.

Mil gracias.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.