warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-string

Ciao a tutti

Andando ad aggiungere una piccola cosa al mio contatore Geiger, ho notato dei warning. Non so se precedentemente non li avevo abilitati, oppure le versioni precedenti dell'IDE non mostravano questo avviso.

Breve riassunto: il progetto è iniziato nel 2016, a poco più di un anno da quando ho iniziato con Arduino e con il C. Allora usai con disinvoltura String; poi, resomi conto dei problemi che dava, tanto più aumentando le funzioni e la complessità del mio contatore Geiger (fa misure a tempo fisso, a precisione fissa, a tempo infinito con calcolo continuo della media e stima dell'errore e altro), il modo più semplice che trovai (pur senza capirlo fino in fondo) per risolvere il problema senza sconvolgere tutto il programma fu sostituire le variabili
String nome_variabile; con char *nome_variabile;

Ora ho rilevato molti warning di questo tipo, seppure tutto funzioni ottimamente:

warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
char *versione="  v1.14b";
char *percorso=__FILE__; 
char *tipo[]={"", "SBM-19", "SBM-20", "2xSBM-20", "SBM-21", "SBT-9", "SBT-11A", " SI-1G", " SI-3BG", "SI-19BGM", " SI-22G", " SI-29BG", "LND-712", "  0,0", "Variabile"};

Sono warning importanti?
Quella forma può dare problemi con futuri aggiornamenti del C++?

Finalmente ho trovato qualcosa di chiaro qui:

però nell'array non funziona...

Grazie
Gianluca

Nulla di grave, ma ... se correggi in:

const char *versione="  v1.14b";
const char *percorso=__FILE__;

va meglio ?

Se anche i valori di tipo non li devi modificare, dichiara anche quello un 'const char *' e vediamo che dice ... ::slight_smile:

Guglielmo

Come prova “sistemistica” ti consiglierei di fare installazioni “portable” di versioni vecchie dell’ide, senza aggiornare il core, per controllare che appunto non siano aggiornamenti del compilatore.

Grazie a entrambi.
Aggiungendo const quel warning non appare più. Rimane qualcun altro che non avevo citato:

warning: comparison with string literal results in unspecified behavior [-Waddress]
if(tipo[sonda]=="variabile" || tipo[sonda]=="Variabile")
con
const char *tipo[]={"", "SBM-19", "SBM-20", "2xSBM-20", "SBM-21", "SBT-9", "SBT-11A", " SI-1G", " SI-3BG", "SI-19BGM", " SI-22G", " SI-29BG", "LND-712", "  0,0", "Variabile"};

E lo credo … da quando pensi di poter usare l’operatore == con degli array di char ? ? ? :o :o :o

Quello lo puoi fare se usi la classe String … ma poi, se la usi, siamo noi che ti togliamo il saluto :stuck_out_tongue_closed_eyes:

Devi usare la strcmp() che fa parte di <string.h> che fa parte, come al solito, di AVR libc

e studatevela ‘na vorta pe’ tutte 'sta benedetta libreria ! :confused:

Guglielmo

Userò strcmp(), hai ragione (come ho detto, il programma l'ho iniziato 4 anni fa con le String e da parecchio funziona. Ogni tanto aggiungo o miglioro qualcosa...), però nella pratica funziona, tanto che da un warning, non un errore! Perché?... Associa un valore numerico all'array?

Datman:
Perché?... Associa un valore numerico all'array?

Secondo me NON funziona, o meglio ... magari funziona per caso ... dato che, come dice il compilatore, il risultato di quel confornto "results in unspecified behavior" e quindi, in un comportamento NON prevedibile ... può succedere di tutto ... anche che a volte dia un valore che a te sembra giusto :smiley:

Guglielmo

Mah... Ha sempre funzionato esattamente come precedentemente faceva con le String...

Probabilmente confronta solo il primo carattere, che nel caso specifico sarebbe sufficiente per funzionare:

Sicuramente confronta solo il primo carattere ... stai parlando di 'char' ... per questo si ha un "unspecified behavior" ...

Quindi e comunque ... è un ERRORE di logica confrontare con l'operatore == due stringhe classiche del 'C'. per farlo c'è l'apposita funzione.

Guglielmo

Ho corretto tutto, ottimizzato e aggiunto qualche altra cosa.
Funziona, nessun warning.

Grazie, grazie, grazie! :slight_smile:
Gianluca