italy
Offline
Jr. Member
Karma: 2
Posts: 67
|
 |
« on: December 24, 2012, 11:11:40 am » |
Salve a Tutti,
Ho da poco iniziato con Arduino, sto smanettando con l'uso degli Array, ho qualche discrepanza tra quello che dice la guida online del sito ufficiale e quello che il compilatore mi da quando tento di verificare il codice. in sostanza, il manuale dice che gli array in C sono entità con index "Zero based" ovvero che in un'array di 10 elementi, il primo indirizzo sarà 0, poi 1, poi 2 e così fino all'ultimo, che sarà 9. Un array lo dichiariamo ed inizializziamo così:
int nomearray[8]={10,20,30,40,50,60,70,80,90};
ma tentando di verificarlo nel compilatore del IDE di Arduino, mi da errore di lunghezza array, si stanno inizializzando più valori dell'array dichiarato, se invece di [8] metto [9] l'errore sparisce! idem, se nel manuale si vede che si può dichiarare e inizializzare un'array con index 0 cosi: int array[0]={10}; nella verifica del codice, mi da errore, non ne vuole sapere! ma quale è il problema? forse non inizia da 0? o sto dimenticando qualcosa?
A voi esperti la parola!!
Saluti, Antonio
|
|
|
|
|
Logged
|
|
|
|
|
piacenza
Offline
God Member
Karma: 0
Posts: 500
prima della pazzia c'è la passione
|
 |
« Reply #1 on: December 24, 2012, 11:44:47 am » |
ciao int array[0]={10}; devi scrivere int array[1]={10}; l'indice 0 è la posizione del primo elemento dell'array, tra parentesi indichi la dimensione del array [dim array] stefano
|
|
|
|
|
Logged
|
|
|
|
|
italy
Offline
Jr. Member
Karma: 2
Posts: 67
|
 |
« Reply #2 on: December 25, 2012, 06:42:08 pm » |
Ciao Stefano, grazie del tuo intervento, ma non mi è del tutto chiaro perché da quello che ho letto sul sito ufficiale e cito testualmente: To assign a value to an array: mySensVals[0] = 10;
It also means that in an array with ten elements, index nine is the last element. Hence: int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[9] contains 11 // myArray[10] is invalid and contains random information (other memory address) ma se inserisco nell'IDE Arduino questo: int myArray[0]={10}; mi da errore (too many initializers for 'int ma se faccio: int myArray[0]; //array dichiarata ma senza inizializzazione dati, myArray[0]=10; // assegno all'indice 0 il valore 10 Fatto così Non da nessun errore. Quindi il mio errore è stato non dichiarare prima l'array e poi assegnargli il valore. Ma se faccio così: int Array[1]={10}; //dichiaro l'array e la sua dimensione, ed assegno un valore (ma secondo quanto letto nel sito, ne dovrei poter inizializzare due dati e non uno solo. Fatto così non da errori ovvero: int Array[1]={10}; non da errore. int Array[0]={10}; da errore. int Array[0]={}; non da errore. int Array[8]; Array[8]=10,20,30,40,50,60,70,80,90; così funziona! (senza int perché dichiarata prima e senza dati tra parentesi graffe!! Capisco che il problema è che non ho ancora afferrato del tutto la differenza, dopo tutto è la prima volta con arduino, con C e in generale con le array visto che le ho usate poco in passato, nello stesso sito ufficiale (e in quelli che trattano "C") è chiaro che essendo basati "zero" quindi partono da 0 come dice il testo che ho qui sopra evidenziato (in un'array di dieci elementi, l'ultimo index sarà il 9! quindi se dichiaro ed inizializzo un array con index 0 è plausibile che possa metterci un dato. no? Beh, significa che dovrò prima dichiararla e poi in secondo momento assegnargli i valori, ma sarebbe stato meglio farlo fin dall'inizio, no? Secondo me vi è qualche inesattezza nella spiegazione. Comunque grazie della tua disponibilità! saluti, Antonio PS: scusate del lungo "intervento" tenterò di essere più sintetico in futuro! Ciao!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 7
Posts: 293
|
 |
« Reply #3 on: December 26, 2012, 03:51:40 am » |
sarebbe roba da sezione software... comunque la risposta ai tuoi dilemmi è che il compilatore di arudino non rileva l'overflow di lettura /scrittura sugli array. Quindi quando scrivi fuori dal range in effetti scrivi in una zona "arbitraria" della memoria int myArrayaa[5]={ 1, 2, 3, 4, 5 }; //int myArray[1]={999}; //array dichiarata ma senza inizializzazione dati, int myArray[0]; int myArraybb[5]={ 6, 7, 8, 9, 10 }; //array dichiarata ma senza inizializzazione dati,
void setup() { Serial.begin(9600);
}
void loop() { int i;
myArray[4]=88; // assegno all'indice 0 il valore 10
for (i = 0; i<5;i++){ Serial.print("-"); Serial.print( myArrayaa[i]); }
for (i = 0; i<5;i++){ Serial.print("-"); Serial.print( myArraybb[i]); }
delay (1000);
}
c'è però un aspetto curioso: vedi la dichirazione dell'array da 0 elementi?... così il programma va e stampa i numeri corretti da 1 a 10... se però dichiari l'array centrale di un elemento (riga commentata) quando vai a scrivere fuori range vai a scrivere su arraybb... come ci si aspetterebbe... in pratica per l'allocazione dell'array vuoto sembra che il compilatore si accorga e lo dichiari altrove e non come ci si aspetterebbe tra i due array...
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16993
Don't know what I do
|
 |
« Reply #4 on: December 26, 2012, 04:39:09 am » |
Salve a Tutti,
Ho da poco iniziato con Arduino, sto smanettando con l'uso degli Array, ho qualche discrepanza tra quello che dice la guida online del sito ufficiale e quello che il compilatore mi da quando tento di verificare il codice. in sostanza, il manuale dice che gli array in C sono entità con index "Zero based" ovvero che in un'array di 10 elementi, il primo indirizzo sarà 0, poi 1, poi 2 e così fino all'ultimo, che sarà 9. Un array lo dichiariamo ed inizializziamo così:
int nomearray[8]={10,20,30,40,50,60,70,80,90};
ma tentando di verificarlo nel compilatore del IDE di Arduino, mi da errore di lunghezza array, si stanno inizializzando più valori dell'array dichiarato, se invece di [8] metto [9] l'errore sparisce! idem, se nel manuale si vede che si può dichiarare e inizializzare un'array con index 0 cosi: int array[0]={10}; nella verifica del codice, mi da errore, non ne vuole sapere! ma quale è il problema? forse non inizia da 0? o sto dimenticando qualcosa?
A voi esperti la parola!!
Saluti, Antonio
Il tuo errore è nel non capire la differenza fra l'INIZIALIZZAZIONE dell'array e l'INDICIZZAZIONE dei suoi membri. Quando lo dichiari devi dargli la DIMENSIONE. int nomearray[8]={10,20,30,40,50,60,70,80,90}; //ERRORE: array di 8 celle ma 9 valori int nomearray[9]={10,20,30,40,50,60,70,80,90}; //GIUSTO: array di 9 celle con 9 valori int nomearray[8]={10,20,30,40,50,60,70,80}; //GIUSTO: array di 8 celle con 8 valori Quando invece vuoi accedere ad un elemento, i valori ammessi sono 0...NUMERO ELEMENTI - 1 Quindi nel caso precedente per accedere al 1° elemento usi 0, per accedere all'ultimo usi 9-1=8.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 2284
Arduino rocks
|
 |
« Reply #5 on: December 26, 2012, 10:12:53 am » |
Si possono inizializzare array anche senza valore di elementi tra le [], così: int nomearray[] = {10, 20, 30, 40, 50, 60, 70, 80, 90};
Ma è meglio inserire il numero di elementi nelle quadre, perchè se i valori non combaciano ci si accorge subito grazie al compilatore. La dichiarazione ha un senso logico da intepretare così: int nomearray[8] ; mi riservi 8 spazi di memoria di cui ognuno è grande 16 bit con segno e a questo spazio gli dai il nome nomearray. Posizione: 0 1 2 3 4 5 6 7 locazione [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] R:fatto int valore = nomearray[1]; prendi l'elemento 1 e mettilo nella variabile valore R:fatto Se scrivi nomearray[8] con l'intenzione di prendere l'ottavo elemente vai fuori dalla memoria che hai chiesto di riservarti. Ciao.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #6 on: December 26, 2012, 10:54:05 am » |
Io preferisco (quando possibile) limitare al massimo la ridondanza ed usare l'inizializzazione senza specificare la dimensione (così sono sicuro di non sbagliarmi :-) ) int a[] = { 10, 20, 30, 40 }; Quanti elementi ha questo array ? Boh, lo chiedo al compilatore: #define ARY_LEN(a) (sizeof(a)/(sizeof(a[0]))) for (byte i = 0; i < ARY_LEN(a); i++) { Serial.println(a[i]); }
|
|
|
|
« Last Edit: December 26, 2012, 01:12:01 pm by tuxduino »
|
Logged
|
|
|
|
|
italy
Offline
Jr. Member
Karma: 2
Posts: 67
|
 |
« Reply #7 on: December 26, 2012, 01:05:01 pm » |
Molte grazie per le spiegazioni, finalmente ho capito la differenza:
Quando dichiaro l'array, il numero tra parentesi quadre è il numero di elementi, quindi se scrivo: int MyArray[8]; il mio array avrà 8 elementi.
Quando dichiaro ed inizializzo l'array con i parametri tra parentesi graffe, devo mettere il numero di parametri dichiarati, in questo caso 8.
Purtroppo non avevo capito male questo testo:
It also means that in an array with ten elements, index nine is the last element. Hence: int myArray[10]={9,3,2,4,3,2,7,8,9,11}; // myArray[9] contains 11 // myArray[10] is invalid and contains random information (other memory address)
Mi aveva mandato in confusione la terza e quarta riga, che dice che index=9 conterrebbe il numero 11 (corretto) e che con index=10 sarebbe invalido, non avevo afferrato il concetto (sono 10 elementi, se "leggessi" o "scrivessi" dall'/nell' array il mio ultimo index deve essere 9 ovvero il numero di elementi - 1) FINALMENTE L'HO CAPITA!!!
Molto interessanti quei comandi che permettono di conoscere il numero di elementi di un'array senza averne dichiarato la dimensione, GRAZIE per L'ottima informazione!!
Grazie a Tutti,
|
|
|
|
|
Logged
|
|
|
|
|
|