Come aggiungere parti ad una stringa?

Salve a tutti, come da titolo ho una stringa e vorrei associarle un valore in base ad altri valori. Sicuramente non mi sono spiegato bene, quindi ecco il codice che sto usando attualmente:

      String sqs = "";
      strcat(sqs, print2digits(tm.Hour));
      strcat(sqs, ":");
      strcat(sqs, print2digits(tm.Minute));
      strcat(sqs, ".");
      strcat(sqs, print2digits(tm.Second));
      strcat(sqs, " | ");
      strcat(sqs, tm.Day);
      strcat(sqs, "/");
      strcat(sqs, tm.Month);
      strcat(sqs, "/");
      strcat(sqs, tmYearToCalendar(tm.Year));
      strcat(sqs, ".txt");

Sto cercando di usare strcat (cercando su questo sito in Tutorial > StringAppendOperator) ma a quanto pare non funziona... dove sbaglio?

Sbagli a leggere. Al link usa concat() e non strcat()
strcat() e le varie strxxx() sono funzioni che lavorano su stringhe e NON su String
String è una classe con i suoi "comandi"

Anche facendo così mi restituisce errore: 'concat' was not declared in this scope.

      String sqs;
      sqs = "";
      concat(sqs, print2digits(tm.Hour));
      concat(sqs, ":");
      concat(sqs, print2digits(tm.Minute));
      concat(sqs, ".");
      concat(sqs, print2digits(tm.Second));
      concat(sqs, " | ");
      concat(sqs, tm.Day);
      concat(sqs, "/");
      concat(sqs, tm.Month);
      concat(sqs, "/");
      concat(sqs, tmYearToCalendar(tm.Year));
      concat(sqs, ".txt");
sqs.concat("qualcosa");

Continua a restituirmi errore (invalid use of void expression) nelle righe senza "qualcosa":

      sqs = "";
      sqs.concat(print2digits(tm.Hour));
      sqs.concat(":");
      sqs.concat(print2digits(tm.Minute));
      sqs.concat(".");
      sqs.concat(print2digits(tm.Second));
      sqs.concat(" | ");
      sqs.concat(tm.Day);
      sqs.concat("/");
      sqs.concat(tm.Month);
      sqs.concat("/");
      sqs.concat(tmYearToCalendar(tm.Year));
      sqs.concat(".txt");

Cosa ritorna la funzione print2digits()?

Viene utilizzata per ricavare le informazioni dal modulo DS1307 mediante la libreria DS1307RTC

Ti ha chiesto COSA ritorna, NON a che serve ...
... metti qui il codice di quella funziona (... mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra).

Guglielmo

(Già, e lo so benissimo cosa ritorna, era una domanda retorica volta a fare ragionare il ragazzo :).)

Giusto... ritorna un numero.
Ho risolto così:

      sqs = "";
      sqs.concat(tm.Hour);
      sqs.concat(":");
      sqs.concat(tm.Minute);
      sqs.concat(".");
      sqs.concat(tm.Second);
      sqs.concat(" | ");
      sqs.concat(tm.Day);
      sqs.concat("/");
      sqs.concat(tm.Month);
      sqs.concat("/");
      sqs.concat(tm.Year);
      sqs.concat(".txt");

Bravo, ma stai generando il nome di un file? Occhio che in tal caso stai usando caratteri non permessi!

Si, ci sono caratteri non permessi perché il file non viene creato veramente, quindi ne approfitto per una migliore leggibilità.

Su queste MCU sarebbe meglio non usare String, avido di memoria.
Meglio le stringhe classiche del C, ovvero i vettori di caratteri terminato da car.speciale '\0'
Visto che stai imparando, ti consiglio di passare alle vere stringhe del c con l'uso delle funzioni strxxx() e a snprintf()

nid69ita:
Su queste MCU sarebbe meglio non usare String, avido di memoria.
Meglio le stringhe classiche del C, ovvero i vettori di caratteri terminato da car.speciale '\0'
Visto che stai imparando, ti consiglio di passare alle vere stringhe del c con l'uso delle funzioni strxxx() e a snprintf()

Cioè?

String è una libreria, crea oggetti di tipo String, che possono portare al consumo totale della memoria visto che fa allocazione dinamica e Arduino Uno ha soli 2Kb di SRAM.
Se usi le stringhe del C classiche è meglio.
Basta che fai una ricerca nel forum su problema esaurimento memoria String (nello specifico frammentazione della memoria)
https://forum.arduino.cc/index.php?topic=415238.0
Qui, ma in inglese: The Evils of Arduino Strings | Majenko's Hardware Hacking Blog

In 'C' le strighe altro non sono che array di "char" e la fine di una stringa viene identificata dal carattere 0x00, nel reference le trovi QUI. Quella che stai invece usando tu è la "classe" String del C++, descritta nel reference QUI.

Noi sconsigliamo sempre l'uso della classe String su una MCU come Arduino ...

Ricorda che NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Quello che occorre fare è imparare ad usare le stringhe classiche del 'C' e le funzioni che trovai nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.

Guglielmo

1 Like

Grazie, link molto utili.