ciao a tutti.
So che a molti sembrera' banale, ma davvero non riesco a capire.
tento di fare questo:
typedef struct
{
char IDDevice [12];
int SoilMost;
int SoilMostx100;
char Hod [3];
char Mod [3];
char Dom [3];
char Moy [3];
char Year [5];
} record_type ;
RTC_DATA_ATTR int XLoop = 0;
RTC_DATA_ATTR char* XDevice;
RTC_DATA_ATTR record_type XRecord[6];
void setup() {
}
void loop() {
Serial.print(XDevice);
XLoop=0;
XRecord[XLoop].IDDevice = "HegoProbe01";
}
e mi dice questo:
sketch_sep16a:24:28: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
XRecord[1].IDDevice [12] = "HegoProbe01";
^~~~~~~~~~~~~
exit status 1
invalid conversion from 'const char*' to 'char' [-fpermissive]
Non capisco perche'. Ho anche previsto lo spazio in piu' per il carattere di fine stringa.
Scusate il quesito banale, ma evidentemente mi sta sfuggendo qualcosa di macroscopico.
grazie
P.S. ovviamente lo skectch riportato e' solo un 'estratto' che faccio girare cosi per cercare di rimuovere tutte le altre possibili cause.
Non c'entra la "struct", è prioprio un errore di sintassi ... NON si può assegnare così una stringa ad un char array ... quello lo puoi fare SOLO quando la definisci, es:
char mioNome[] = "Guglielmo";
... in tutti gli altri casi devi usare le apposite funzioni che trovi in string.h ed in particolare, in questo caso, la strcpy().
Oltretutto, solo ora sto cominciando a raccapezzarmi con le varie librerie. Non ero abituato a cambiare istruzioni tenendo conto alla libreria caricata. Ho riempito quindi lo sketch con 1000 'dialetti' presi da esempi su internet , ma ognuno da librerie differenti......
... lo scopo era far vedere che, in fase di dichiarazione di un array di char puoi assegnare il valore con '=', dopo, in corso d'opera, non puoi assegnargli un altro valore sempre con '=' ma devi farlo con strcpy() e quindi ... perché confondere le idee e creare un valore costante a cui non devo/posso riassegnare un valore?
Ribadico che:
il modo corretto di definire una stringa classica di caratteri è:
char nomeStringa[N]; dove N è la dimensione in caratteri -1 (il terminatore 0x00).
In fase di definizione è possibile assegnare un valore iniziale con la forma
char nomeStringa[N] = "xxxxxxxxxxxx"; dove gli xxxx devono essere massimo N-1 caratteri
Nel corso del programma si può cambiare il contenuto della suddetta stringa, sempre rimanendo nel limite di N-1 caratteri, usando la funzione strcpy().
Tutto il resto uno se lo va a studiare DOPO che ha capito i concetti di base
... ancora con queste costanti ??? ma chi ti ha parlato di costanti? ma se deve riassegnargli il valore cosa cavolo c'entrano le costanti?
Perché tu ancora NON hai capito che a lui serve una variabile char di dimensione che decide lui poiché poi, dinamicamente, nel corso del programma, gli riassegna dei valori con la strcpy() ... se gli serve da 50 o 100 caratteri che fa scrive 50 o 100 caratteri tra apici per assegnare il valore massimo iniziale così lo calcola il compilatore?
Certo che non l'ho capito, non ha scritto che vuole incorporarla, tra l'altro così si ritrova con due C string in memoria ram, una la literal che esiste sempre più la copia. Visto che la literal è sempre presente perché non usare un puntatore come ho mostrato io?
Va beh, lasciamo stare, parliamo due lingue differenti ...
... fortuna che l'OP ha capito quello che deve fare, lo ha fatto ed ha anche messo risolto alla discussione.
Ha dichirato XRecord globale, allora ha due possibilità, una di queste è usare strcpy, sempre se è necessario. L'altra è quella che ho mostrato.
Mi viene solo un buon motivo per incorporare la literarl string; solo quando vuoi serializzare una struttura dati per spedirla byte per byte.
Ora cosa ci deve fare non lo ha detto e quindi se gli serve incorporarla usa strcpy, se non serve incorporarla usa il puntatore.
Tra l'altro nessuno gli ha fatto notare che:
Serial.print(XDevice);
non stamperà nulla poiché XDevice è dichiarato come puntatore globale che per default viene inizializzato al valore di default che è zero o nullptr. Per fortuna la print fa un controllo sul puntatore.
Se fosse stato locale sarebbe sua responsabilità inizializzarlo almeno a nullptr.
PS: Si mi rendo conto che parliamo un altra lingua. Reciprocamente il mio dire non entra nel tuo capire.
Non volevo scatenare diatribe fra scuole di pensiero. Oltretutto vi seguo a fatica
Ad ogni modo per adesso, ho risolto e fa quello che volevo facesse.
Devo preparare un array di 6 record in memoria non volatile , che poi sara' letto e spedito in una volta sola ad un database on cloud (Influxdb). Sbagliavo a fare le assegnazioni per mia ignoranza sulle stringhe.
Adesso me la sono cavata cosi RTC_DATA_ATTR char XDevice[] = "HegoProbe01";
scrivo poi i record sul DB.
Adesso si apre il problema di organizzare appropriatamente i dati su influxdb, perche' assieme al valore da visualizzare sul grafico, vorrei accoppiasse la stringa col MIO timestamp che ho preparato per ogni punto, ma questo e' un'altro topic....
Grazie a tutti per i vostri commenti e insegnamenti (che dovro' rileggermi almeno 10 volte)...