Go Down

Topic: [RISOLTO]Problema variabile all'interno del ciclo for (Read 977 times) previous topic - next topic

acron

May 13, 2012, 11:27 pm Last Edit: May 14, 2012, 09:52 pm by acron Reason: 1
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 ?

Code: [Select]
#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);

}

}

uwefed

Hai un overflow del array.
Code: [Select]
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

leo72

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

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.

leo72


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.

uwefed


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

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.

uwefed


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

uwefed


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

MauroTec

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.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

BrainBooster

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

acron

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

uwefed


acron

Quote
Allora era quello che dicevo?
Ciao Uwe


Si, è bastato correggere l'ndice dell'array e sostituire
Code: [Select]
for (int m = 0; m <= nr_item; m++)
con

Code: [Select]
for (int m = 0; m < nr_item; m++)

Go Up