ciao,
lo so che String sarebbe meglio non usarla, ma non pensavo che desse problemi anche cosi'....
ho una String: String Xtimestamp = "";
valorizzata da una funzione che restiuisce una stringa (ad uso timestamp) come questa:
17-06-2023 10:54:09.
faccio questa assegnazione: sensorData[NRead].timestamp = Xtimestamp.c_str();
in questa struttura:
risultato: niente. blanc.
ho provato anche la semplice assegnazione e altri metodi, ma niente....
Ma e' cosi' complicato assegnare una stringa ad un'altra stringa?
Non mi è chiara una cosa ... nella struct tu dichiari un oggetto di tipo String di nome timestamp, ma poi usi la funzione c_str() su un oggetto, evidentemente anche lui di classe String ,per ottenere una stringa classica del 'C' (un char array) da assegnare ad ... un oggetto di classe String ...
... il senso di tutto questo ?
ciao ,
intanto grazie per la risposta.
Be' il senso e' che avevo letto da qualche parte che la funzione String in realta' era un wrapper di altre funzioni (non ricordo piu') e che in alcuni casi poteva dare dei problemi. Allora ho cercato un modo differente nella vana speranza che funzionasse. Ma come dicevo nel primo post, ne ho provate tante ma niente....
Ho centinaia di altre assegnazioni nel codice e funziona tutto. Chissa' cosa succede in quella funzione. Ho anche pensato a cambiare il nome del campo, magari timestamp e' una parola riservata o interferisce con qualcosa....
P.S: sono sempre piu' tentato dal micro python...magari e' piu' 'robusto'.... non so come dire...
RTC_DATA_ATTR è una direttiva al compilatore che fa in modo che la variabile associata venga memorizzata in un'area di memoria che mantiene inalterato il valore durante lo sleep.
Tu però gli stai passando una variabile String di tipo dinamico ed il compilatore non è in grado di determinarne la dimensione (perché ancora indefinita) e quindi di riservare lo spazio di memoria necessario.
Qui stai assegnando ad una variabile String il valore di un puntatore a String e non è la stessa cosa
Comunque per un timestamp secondo me la scelta giusta del tipo variabile sarebbe un induceva unsigned long (epoch time) e non una stringa sia essa String o C string
il fatto di acvere un timestamp sottoforma di string e' per la comodita' di poterlo 'maneggiare' anche in varie altre parti di programma senza problemi , ma effettivamente, con qualche sforzo in piu' potrei convertirlo in string al momento opportuno.
Per quanto riguarda la struttura, effettivamente potrebbe essere che rtc_data_attr non riesca a gestire una stringa... forse sarebbe meglio una char[20] ad esempio e quindi lasciare l'assegnazione con Xtimestamp.c_str(); che in questo caso avrebbe piu' senso....
col ciclo di for alla fine (asteriscato) sto vedendo tutto l'array man mano che si riempie con i vari timestamp.
Era da giorni che ci stavo su! Assolutamente subdolo (almeno per me) .
Ah , per sicurezza, ho aggiunto la scrittura dello '0' a fine stringa....visto che e' cosi' 'permaloso' ..
Ritorno su queste 'benedette' string per una nuova 'stranezza' (che poi al solito, verra' fuori che stranezza non e')....
In breve, dichiaro una String con RTC_DATA_ATTR.
Assegno un valore.
vado in deep sleep.
Riparto dopo un tot, variabile azzerata!
Il bello e' che tutto il resto funziona, ma sto avendo il dubbio sul fattio della corretta gestione delle string in rtc memory....
mi pare aver letto qualcosa mesi fa in proposito. Ne sapete qualcosa cortesemente?
hai ragione Guglielmo, ho gia' provveduto ad un 'aggiramento' del problema.
Ad ogni modo, mi pare che la gestione delle stringhe & similia, e' un po' troppo macchinoso.
Stavo pensando di passare a micropython, perche' da una prima occhiata mi pare molto meno rigido su diversi aspetti, pur mantenendo una certa ovvia rigorosita' di linguaggio......
Avresti lo stesso identico problema anche usando il micropython perché il meccanismo di ritenzione delle variabili associate alla macro RTC_DATA_ATTR non ha nulla a che fare con il linguaggio di programmazione utilizzato.
Se vuoi utilizzare il micropython perché ti piace di più, è una possibilità ed ovviamente sei liberissimo di sperimentare, ma questa scelta per come la vedo io non dovrebbe nascere da "antipatia" nei confronti delle istruzioni C/C++ per la manipolazione delle stringhe che sono la base da cui tutto poi si sviluppa.
hai ragione, ma a volte si vive anche di 'antipatie ' e 'simpatie'....Faccio una battuta...: bei tempi il Clipper 87! facile come il basic e potente come il PL/1.... mah!
Meglio ancora la versione successiva che ho usato per circa 4 anni.
Ma niente in confronto alla potenza del C/C++, forse in futuro il D oppure Rust ma al momento è così.
Però c'è da comprendere in profondità la differenza tra piattaforme embedded e PC e non è facile specie se ci si è limitati a scrivere programmi senza indagare sul funzionamento di un moderno PC incluso ovviamente il sistema operativo che è il punto chiave.
Abbiamo intrapreso da poco la strada che porta all'obbiettivo. Oggi non serve sapere come funziona un PC per potere scrivere un programma, ma un tempo non era così. L'obbiettivo è stato raggiunto per la maggior parte delle applicazioni che girano sul PC, ma per altre occorre sempre elevata competenza hardware/software di un PC.
Forse in futuro accadrà anche su piattaforme embedded altamente standardizzate, dove un artista scrive applicazioni senza nulla sapere di hardware, C string null terminated, FIFO, DMA, IRQ, ISR, allocazione dinamica della RAM ecc.
Ma per adesso pare evidente che non siamo ancora arrivati a questo punto.