Parliamo ancora di String

Ritorno un attimo sulla male-benedetta classe String

il mio codice

client.println("['Ora', 'Produzione', 'Consumo', 'Gestore' ],");

Debbo sostituire, per esempio, 'Gestore' con Enel

La cosa più facile sarebbe :

String myGestore = "Enel";
client.println("['Ora', 'Produzione', 'Consumo', ' " +  myGestore + " ' ],");

domande :

  1. se si usa String all'interno di una void (senza che String sia quindi una variabile globale) si crea lo stesso il problema del gar.coll. ? (chiedo perchè non ricordo)
  2. in ogni caso, come si potrebbe gestire la client.println senza usare String ma utilizzando char senza che ci sia errore nella visualizzazione?

un minimo di pensiero alternativo ti permette di non andarti ad incasinare con String e nemmeno con stampe strambe...

char altrogestore[]="nomedell'altrogestore";
char enel[]= "enel";
char preambolo[]="['Ora', 'Produzione', 'Consumo', ' ";
char termine[]=" ' ]";
Serial.print(preambolo);
if (gestore==...)
   Serial.print(enel);
else
   Serial.print(altrogestore);
Serial.println(termine);

come vedi, un po' di pensiero laterale...

bene ...
e se dovessi cambiare "Produzione", che è un numero ?
uso il celeberrimo itoa?

int prod = 1234;
char myProduzione[] ;
itoa(prod, myProduzione, 10);
Serial.print (myProduzione);

ma perché....

basta stampare direttamente il numero

Seriel.print (1234);

il C è semplicità, non seghe mentali...

il C è semplicità

su questa asserzione la mia mente presenta forti dubbi ... :frowning:

stasera provo ...

la gestione delle stringhe, con tutta la buona volontà, la trovo veramente difficile da assimilare.
ma che ne so, sarò di certo io che sono scemo :frowning:

Se possibile, potrei avere una risposta anche alla domanda 1. del primo post ?

mai provato, e non intendo provare

basta che fai un programma di prova con e senza le string e vedi per quanto tempo funziona senza incatastarsi....

non mi ricordo chi storicamente diceva che "per battere il nemico devi conoscerlo a fondo" .
la mia era una richiesta "culturale" ...
debbo però confessare che fino ad un anno fa usavo frequentemente String su un esp32 e dopo giorni di funzionamento che chiamavano la routine eventualmente sospetta ogni secondo, non l'ho mai visto incasinarsi.
Spesso serve un pò di fortuna, nella vita ... :slight_smile:

infatti
tu vuoi batterlo e tu fai le prove

io sono abbastanza sgamato da non doverlo battere, lo so evitare...

ribadisco : era e rimane una richiesta di alunno. Io non voglio batterlo, voglio capire.
se ero sgamato non avrei chiesto.
Chi è sgamato mi spieghi, come farebbe un maestro alle elementari.

ma perchè in questo forum io risulto antipatico ?

ma no, è solo che io non provo alcun interesse a scoprire queste cose, e la soluzione di fare un semplice test non è difficile

in effetti l'antipatico qui sono io...

lo so di avere un pessimo carattere...

lasciamo perdere il carattere, ognuno di noi ha i suoi problemi col comunicare.

però se io entro in un forum e chiedo "perchè questo ?", non è risolutivo trovare una "soluzione" che dica "prova e vedi" .... semplicemente perchè non è una soluzione.
magari sarebbe meglio dire "perchè abc e anche d".
poi anche "prova e vedi .... "

ok ... grazie in ogni caso e comunque per il tempo dedicatomi

... considera che stai parlando di un oggetto che ha un bel po' si SRAM (l'IDE riporta 327680 bytes ... pensa ai 2048 bytes di Arduino UNO e ti rendi conto) e che, prima che si presenti il problema descritto QUI, può passare moooolto tempo o non capitare mai.

Guglielmo

si Guglielmo, prima di scrivere questo post avevo letto quel thread ma non mi sembra di aver trovato una risposta, o forse mi è sfuggito.
O quanto meno la risposta potrebbe essere : si, anche se locale, String crea zozzeria. Eventualmente usaSafeString ; ma io non vorrei usare nè l'una nè l'altra, essendo ormai un ostinato utilizzatore di char che però, in alcuni casi necessita - per mancanza di tempo da dedicare - dell'uso di String.
Volevo capire meglio la soglia dei rischi di collasso ...

... veramente la mia risposta NON era un invito ad usare SafeString né, tantomeno, String, ma era proprio la spiegazione del perché non ti è successo in relazione a come funziona String (spiegato nel link che avevo messo)!

Guglielmo

ok grazie

Ma usare sprintf() magari? Assumiamo che tu abbia i valori testuali già in variabili stringa (char array, non String...) e numeriche:

  char buf[40]; // Dimensionare in base alla lunghezza massima prevista, +1
  sprintf(buf, "[ '%s', '%d', '%d', '%s' ]", strOra, intProduzione, intConsumo, strGestore);
  Serial.println(buf);

e perché?
per usare una inutile variabile in più?

hai in mano i dati e li sbatti sulla seriale nell'ordine che ti serve, che te ne fai di archiviarli e poi stamparli? li stampi direttamente e ti liberi di storie inutili

come ho scritto ieri, il C è semplicità
se non ci si arriva....

Perché con la sprintf puoi anche controllare il formato dei dati da inserire, e comunque a priori non puoi sapere cosa deve scrivere, dove memorizza i suoi dati, e come ce li ha. Il mio era un discorso generico (a parte che una variabile buffer magari globale può essere utilizzata in tutto il resto del codice -che né io né te conosciamo-), ovviamente ognuno è libero di fare quello che vuole, ma se non conosceva la sprintf() magari potrebbe essergli utile anche sapere della sua esistenza, senza fare i "talebani del C".
Chiaro ora?

chiaro

Considerando che @fotosettore sta usando un ESP32 dove la classe Serial ha il metodo printf() già di suo, non serve nemmeno il buffer (anche se comunque un buffer di mezzo c'è ugualmente nel metodo, ma almeno è trasparente per l'utente finale).