Offline
Newbie
Karma: 0
Posts: 3
|
 |
« on: October 18, 2012, 02:50:39 am » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17011
Don't know what I do
|
 |
« Reply #1 on: October 18, 2012, 03:24:53 am » |
Devi convertire il numero in stringa: http://arduino.cc/en/Reference/StringConstructorquindi fai ValoreUnico = Valore1 + String(Valore2);
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 3
|
 |
« Reply #2 on: October 18, 2012, 03:45:02 am » |
Grazie
|
|
|
|
|
Logged
|
|
|
|
|
rome
Offline
Sr. Member
Karma: 13
Posts: 348
|
 |
« Reply #3 on: October 18, 2012, 03:59:49 am » |
... 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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17011
Don't know what I do
|
 |
« Reply #4 on: October 18, 2012, 10:04:51 am » |
...che eviterei se non strettamente necessaria per non ritrovarsi centinaia di byte di flash consumati dalla sprintf 
|
|
|
|
|
Logged
|
|
|
|
|
rome
Offline
Sr. Member
Karma: 13
Posts: 348
|
 |
« Reply #5 on: October 18, 2012, 10:40:10 am » |
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 ... :-)
|
|
|
|
« Last Edit: October 18, 2012, 10:47:23 am by brunialti »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17011
Don't know what I do
|
 |
« Reply #6 on: October 18, 2012, 11:05:47 am » |
Uh... non avevo mai visto l'occupazione di memoria di String 
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #7 on: October 18, 2012, 11:21:17 am » |
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
Sr. Member
Karma: 13
Posts: 348
|
 |
« Reply #8 on: October 18, 2012, 11:36:11 am » |
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
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #9 on: October 18, 2012, 11:46:02 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
rome
Offline
Sr. Member
Karma: 13
Posts: 348
|
 |
« Reply #10 on: October 18, 2012, 11:59:36 am » |
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
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #11 on: October 18, 2012, 12:03:50 pm » |
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
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #12 on: October 18, 2012, 12:19:45 pm » |
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() { }
|
|
|
|
|
Logged
|
|
|
|
|
rome
Offline
Sr. Member
Karma: 13
Posts: 348
|
 |
« Reply #13 on: October 18, 2012, 12:37:57 pm » |
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. 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
Tesla Member
Karma: 76
Posts: 7539
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #14 on: October 18, 2012, 12:44:10 pm » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
|