Pages: [1]   Go Down
Author Topic: [RISOLTO]Problema variabile all'interno del ciclo for  (Read 745 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);

}

}
« Last Edit: May 14, 2012, 02:52:52 pm by acron » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20195
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Offline Offline
Full Member
***
Karma: 0
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20195
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20195
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20195
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 2792
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Full Member
***
Karma: 0
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie a tutti, non ci sarei mai arrivato!!!  smiley
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20195
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora era quello che dicevo?
Ciao Uwe
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 128
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Allora era quello che dicevo?
Ciao Uwe

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

Code:
for (int m = 0; m < nr_item; m++)
Logged

Pages: [1]   Go Up
Jump to: