ciao a tutti, stavo cercando di venirmene fuori con un codice un po' piu' elegante nel senso, in questo caso ho solo 6 volori nell'array ma se ho 200 valori? come ho scritto il codice non ha senso..... idee su come si possa fare?
grazie
diciamo che non è importante il progetto fisico in se ma cosa vuoi fare con il codice...quindi poco importa che sia un orologio nixie...quello che interessa è che tipo di "manipolazione" vuoi fare con gli array!?...dal tuo codice di esempio si capisce poco, almeno per me, di quello che vuoi fare...sembrerebbe che avessi delle variabili globali singole che vorresti passare ad altre variabili globali singole tramite una funzione...per me ha poco senso sta cosa.
Di sicuro così non va bene, minimo devi dichiarare l'array globale, es:
int hour;
int minute;
int second;
// sta brutta abitudine di mettere tutto in una riga, senza leggere che nei libri lo si fa per esigenze tipografiche. Quindi una dichiarazione per riga.
#define AAA_LEN 7
int aaa[AAA_LEN];
Dentro la funzione questa riga però:
int aaa[6]={0,0,0,0,0,0};
dichiara e inizializza un array di int di nome aaa grande 6 elementi indicizzati da 0÷5, array che è locale allocato nello stack che viene ripulito quando la funzione termina.
Non ti so suggerire del codice, c'è troppa confusione da parte tua. Non capisco perché usare puntatori hour, minute e second, per di più sono variabili globali visibile da dentro la funzione.
Inoltre NON ha senso dichiarare TUTTI i parametri puntatore.
I primi tre della funzione non hai necessità di modificarli dentro alla funzione, quindi quelli passali normalmente, senza puntatore.
P.S. specificate anche sempre su che Arduino state lavorando.
C:\Users\ciccio\Documents\Arduino\sketch_dec27a\sketch_dec27a.ino: In function 'int divArray(int*, int*, int*, int*)':
C:\Users\ciccio\Documents\Arduino\sketch_dec27a\sketch_dec27a.ino:26:14: warning: invalid conversion from 'int*' to 'int' [-fpermissive]
return myArr;
^~~~~
Nel prototipo della funzione hai specificato che questa restituisce al chiamante un valore di tipo int, però l'ultima riga della funzione restituisci il puntatore myArr:
return myArr; // questo è un puntatore passato come argomento
Ora con i puntatori in questo specifico caso non ha senso restituirli al chiamante, ci basta specificare il puntatore nella lista degli argomenti.
Tagliando corto, elimina la riga return myArr; e non riceverai errori (mi pare) ma un warning che ti avvisa che la funzione non ha un return, ma il prototipo lo prevede.
Risolvi specificando che la funzione restituisce nulla al chiamante, cioè al posto di int ci scrivi void.
void divArray( int *hour, int *minute, int *second, int *myArr ){
PS: nota gli spazi dopo la virgola e dopo e prima delle parentesi tonde. Al compilatore non serve ciò ma a chi legge il codice si eccome se serve.
A me sembra che si voglia creare una funzione di inizializzazione a run-time, in gerene queste funzioni hanno init nel nome, es:
void initDateTime(int *hour, ... ecc.
grazie a tutti, adesso funziona! il compilatore continua a darmi un'errore pero' lo caompila e il risultato e' quello giusto.
un saluto, alle prossime.
A.
Se leggi bene, il compilatore non ha sollevato un errore, ma un warning:
warning: invalid conversion from 'int*' to 'int' [-fpermissive]
Ti avvisa che c'è qualcosa che non torna secondo lui.
Resta però il fatto che è un errore di programmazione.
Non sottovalutare i warning del compilatore, quasi certamente dietro un warning c'è un errore di programmazione che si presenta a run-time, cioè il risultato non è quello che ti aspetti.
Domanda: ma con l'array poi che ci devi fare?
No perché se lo devi scansionare in un ciclo for e allora va bene, diversamente ci sono le struct come contenitori di dati eterogenei, cioè puoi mischiare int, byte float ecc es:
struct myDateTime {
byte hour; // per le ore basta il byte
byte minutes; // per i minuti basta il byte
byte seconds; // come sopra
uint16_t year; // per l'anno ci voglio 2 byte
}