Sommare ... Stringa + Int

Ciao, sono nuovo del forum e sono alla realizzazione dei primi programmi con arduino e ho ottima esperienza con Visual Basic e Assambler.

Ho bisogno del vostro aiuto, non riescoa creare una stringa che sia la somma (concatenamento) di una stringa e un valore Int.

String Valore1 = "AB" ;
Int Valore2 = 5 ;
String ValoreUnico = "" ;

ValoreUnico = Valore1 + Valore2 ???

A me occorre avere una stringa risultato ValoreUnico che sia "AB5"

Grazie Marco.

Devi convertire il numero in stringa:
http://arduino.cc/en/Reference/StringConstructor

quindi fai
ValoreUnico = Valore1 + String(Valore2);

Grazie :slight_smile:

... oppure usa sprintf per formati più complessi

char buf[10]; // dimensione di un buffer generico che ospita stringhe
...
sprintf(buf,"%s%d",valore1,valore2); // in buf hai stringa formattata

...che eviterei se non strettamente necessaria per non ritrovarsi centinaia di byte di flash consumati dalla sprintf :wink:

la libreria String.h consuma parecchio di più ...
Poi de gustibus ...

p.s. il codice che segue è solo per verificare occupazione memoria. non l'ho testato ... :slight_smile:

Uh... non avevo mai visto l'occupazione di memoria di String :astonished:

brunialti:
la libreria String.h consuma parecchio di più ...

solo 20-30 byte in più, in pratica pesano uguali come occupazione di flash, la vera soluzione, per non sprecare flash, è non usare ne la sprintf e nemmeno il formato dati stringa, lavorare con un array di char.

dalla veloce prova empirica sono circa 400.
ma cosa intendi per lavorare con un array di char?
Tanto per avere una idea se posti l'esempio per il problema di questo topic facciamo una rapida verifica di occupazione di memoria ...

brunialti:
dalla veloce prova empirica sono circa 400.

Dalla prova, al volo, che ho fatto io la differenza in compilazione è circa 30 byte.

ma cosa intendi per lavorare con un array di char?

Semplicemente usare "char pippo[n]" ove n è il numero massimo di caratteri previsti, come si è sempre fatto in C.

Semplicemente usare "char pippo[n]" ove n è il numero massimo di caratteri previsti, come si è sempre fatto in C.

? ma la variabile buf[10] dell'esempio che cos'è?
Scusami, ma non capisco qual'è la tua proposta: niente string e sprintf, ok.
Ma cosa proponi? Se posti il codice vediamo se c'è una soluzione migliore in termini di occupazione per ottenere la stringa che vole Marcoffio.

brunialti:
Scusami, ma non capisco qual'è la tua proposta: niente string e sprintf, ok.

Appunto non usare ne il tipo dati string e tantomeno la sprintf, si lavora direttamente sull'array e non credo che devo spiegarti come ci si caricano sopra i dati e come si fa l'eventuale concatenazione.

Un banale esempio:

void setup()
{
  char string1[20];
  char string2[20];
 
  Serial.begin(9600);
  strcpy(string1, "stringa1");
  strcpy(string2, "stringa2");
  Serial.println(string1);
  Serial.println(string2);
  strcat(string1, string2);
  Serial.println(string1);
 }

void loop()
{
}

Quello che avevo percepito nella richiesta di Marcoffio era un aiuto a capire quali sono i diversi approcci per formattare stringhe apartire da variabili di tipo diverso. Poi sono usciti i discorsi da smanettone sulla occupazione memoria :slight_smile:

Io suggerivo la sprintf perchè la richiesta riguardava anche la conversione di un numerico, in questo caso un int.
Lo suggerisco sopratutto a chi inizia e probabilmente non ha problemi di memoria, perchè è molto flessibile.
Io personalmente non amo molto il tipo string in ambienti minimali come arduino, anche perchè spesso crea subdoli problemi di memoria al crescere del codice. Ma credo che sia una questione di abitudine o si stile....

Aggiungo un altro esempio sull'onda di astobeed, usando itoa. In effetti si risparmia circa (ad occhio) 1k.

int valore2=5;
char valore1[]={"ab"};
char buf[10];
char buf1[5];

void setup(){
itoa(valore2,buf1,10);
strcpy(buf,valore1);
strcat(buf,buf1);
}

void loop(){}

(non testato ma ad occhio dovrebbe compilare).

brunialti:
poi sono usciti i discorsi da smanettone sulla occupazione memoria :slight_smile:

Non sono da smanettone, sono discorsi, e metodi, validi per chi con i micro ci lavora e spesso deve combattere con le limitate risorse, oltre all'esigenza produttiva di usare il micro meno costoso possibile, risparmiare decine, se non centinaia, di byte flash/ram è un must :slight_smile: