Pages: [1]   Go Down
Author Topic: Sommare ... Stringa + Int  (Read 898 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

quindi fai
ValoreUnico = Valore1 + String(Valore2);
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie  smiley

Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... oppure usa sprintf per formati più complessi

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ... :-)



* Immagine1.gif (44.51 KB, 500x600 - viewed 14 times.)

* Immagine2.gif (40.23 KB, 500x600 - viewed 13 times.)
« Last Edit: October 18, 2012, 10:47:23 am by brunialti » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Uh... non avevo mai visto l'occupazione di memoria di String  smiley-eek
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

dalla veloce prova empirica sono circa 400.

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

Quote
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.
Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

« Last Edit: October 18, 2012, 12:01:31 pm by brunialti » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Un banale esempio:

Code:

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()
{
}
Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :-)

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.

Code:
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).


Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

poi sono usciti i discorsi da smanettone sulla occupazione memoria :-)

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  smiley
Logged

Pages: [1]   Go Up
Jump to: