[RISOLTO]Problema variabile all'interno del ciclo for

Ciao a tutti,
immagino sia una stupidata dato che sono alle prime armi, ma mi succede una cosa strana con una variabile all’interno del ciclo for.

Copio e incollo la parte del codice dove riscontro il problema.
Praticamente una volta finito il ciclo, GLCD.print(ch_Menu) stampa inspiegabilmete il numero 7 sul display…non dovrebbe essere sempre 0 ?

#include "glcd.h"
#include "fonts/allFonts.h"
#include "Button.h"

int y = 0;
const int nr_item = 2; //compreso lo 0
int x[nr_item]; //centro colonna menu
int ch_Menu1 = 0;

gText index; //titolo menu
gText t1[nr_item];
gText t2;

Button b_enter = Button(45,PULLDOWN);
Button b_esc = Button(47,PULLDOWN);
Button b_ok = Button(49,PULLDOWN);
Button b_down = Button(51,PULLDOWN);
Button b_up = Button(53,PULLDOWN);


char * t_index="MENU";
char * t1_1[] = {" Gestione LED ", " Gestione ", " Modifica Data/Ora "};

void setup()
	{
	GLCD.Init(NON_INVERTED);
	GLCD.SelectFont(System5x7);


	for (int i = 0; i <= nr_item; i++)
	{
		y = y + 10;
		t1[i].DefineArea(0, y, 21 ,1,System5x7);
		//t1[i].DefineArea(0, y, GLCD.Width,y + 10);
		//t1[i].SelectFont(System5x7, BLACK);
	}

	}

void loop()
{

			for (int m = 0; m <= nr_item; m++)
			{

				x[m] = GLCD.Width/2 - GLCD.StringWidth(t1_1[m])/2; //Calcolo per centrare il testo nelle righe
				t1[m].CursorToXY(x[m], 2);
				t1[m].Puts(t1_1[m]);

				GLCD.print(ch_Menu1);
				delay(500);

			}

}

Hai un overflow del array.

const int nr_item = 2; //compreso lo 0
int x[nr_item]; //centro colonna menu

definisci nr_item a 2 volendo avere 3 posizioni da 0 a 2 x[nr_item] definisce l' array della grandezza 2 con indice 0 e 1

devi scrivere x[nr_item+1] per avere l'array della grandezza 3.

stessa cosa vale per t1[nr_item];

Ciao Uwe

Ma hai altre porzioni di codice dove manipoli ch_Menu1? Essendo una variabile globale puoi cambiarne il valore dovunque.

uwefed ho capito cosa intendi ma non capisco perché la variabile ch_menu1 prende il valore 7.

Leo72 questa è l'unica parte del codice dove utilizzo questa variabile.

acron: uwefed ho capito cosa intendi ma non capisco perché la variabile ch_menu1 prende il valore 7.

Leo72 questa è l'unica parte del codice dove utilizzo questa variabile.

Se allora non la modifichi altrove forse se davvero nr_item manda in overflow il puntatore ad uno degli array (non ho studiato il codice) potrebbe essere che il micro inizia a leggere valori strani dalla memoria.

Sarebbe comunque da guardare anche dentro a GLCD.print() per vedere come viene elaborato il dato ricevuto.

leo72: Ma hai altre porzioni di codice dove manipoli ch_Menu1? Essendo una variabile globale puoi cambiarne il valore dovunque.

Leo non Ti piace la mia idea del Array overflow? Ciao UWe

Chiedevo per capire se c'erano manipolazioni della variabile fatte dal codice. Parrebbe di no. Per averne la certezza bisognerebbe provare il codice ma non uso quelle librerie richiamate dal codice.

acron: uwefed ho capito cosa intendi ma non capisco perché la variabile ch_menu1 prende il valore 7.

Praticamente riservi con int x[2]; 4 Byte di memoria per l'array (2 byte per il tipo INT). Hai definito l'array x[0] e x[1].

Se leggi o peggio scrivi qualcosa in posizione x[2]; lo leggi o scrivi nella posizione di memoria dopo la RAM riservata per l' array. Lí potrebbe essere memorizzata una altra variabile. Il copilatore non fa nessun controllo se superi la lunghezza del Array.

Ciao Uwe

leo72: Chiedevo per capire se c'erano manipolazioni della variabile fatte dal codice. Parrebbe di no. Per averne la certezza bisognerebbe provare il codice ma non uso quelle librerie richiamate dal codice.

Il Array overflow c'é e produce comportamenti del codice inaspettati. Quello che succede a acron é ancora un problema insignificante.

Ciao Uwe

Se definisci const ch_Menu1 il buffer overflow non dovrebbe più strabordare in ch_Menu1 e quindi hai la certezza che si tratta di buffer overflow.

const int ch_Menu1 = 0;

In sintomi di buffer overflow ci sono tutti.

sembra un classico off by one, prova a correggere come dice uwefed e vedi se funge :slight_smile:

Grazie a tutti, non ci sarei mai arrivato!!! :)

Allora era quello che dicevo? Ciao Uwe

Allora era quello che dicevo?
Ciao Uwe

Si, è bastato correggere l’ndice dell’array e sostituire

for (int m = 0; m <= nr_item; m++)

con

for (int m = 0; m < nr_item; m++)