Go Down

Topic: Stampa di un array. (Read 981 times) previous topic - next topic

flayrim

Salve a tutti, ho un piccolo problema.
Ho un array contenente i valori estratti da una seriale rs232, ogni elemento dell'array è una lettera o un numero del messaggio inviato tramite rs232.
Vorrei spedire il messaggio ricevuto tramite pagina php. Avrei bisogno di riunire i dati contenuti nell'array in una stringa, per avere un solo elemento da inviare e non 1000.
Aspetto vostre notizie, grazie!

lesto

qualcosa tipo questo?

Code: [Select]

String tutto ="";
for (int i=0;i<lunghezzaArray;i++){
   tutto = tutto + array[i];
}
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

tuxduino

I numeri devi rappresentarli sottoforma di stringa ? In quel caso ci vuola una sprintf o una itoa prima della concatenazione.

brunialti

Mah. usare il tipo stringa che "cresce" in un loop è la strada più veloce per esaurire la memoria dii arduino runtime :-)

Ma una bella strcat?

Code: [Select]
#define MAX_STR_LEN 512
...
char tutto[MAX_STR_LEN];
char buf[5];
...
for (int i=0;i<lunghezzaArray;i++){
  strcat(tutto,itoa(buf,array[i],10));
  }


più o meno (non l'ho testata) e assumando che array[] sia un array di int.

tuxduino

brunialti, per quanto preferisca la tua soluzione a quella con la String, direi che il modo migliore per esaurire la ram è allocare buffer grandi quanto 1/4 la ram stessa :P

brunialti

#5
Oct 02, 2012, 09:18 pm Last Edit: Oct 02, 2012, 09:19 pm by brunialti Reason: 1
Eh dai, non fare così...  :~ la dimensione la decidi tu, ovviamente, in base al calcolo della lunghezza dell'array... o della lunghezza della stringa di stampa... e poi almeno la esaurisco alla compilazione e non al runtime ...
Ricordati che ogni volta che usi operatore + con string, bisogna fare un realloc implicito. con il pericolo (o la certezza se sei pessimista) che se la stringa non riesce ad espandersi in una area contigua, alloca un novo spazio lasciando i famosi "buchi" nella memoria heap. come un formaggio svizzero

brunialti

#6
Oct 02, 2012, 09:27 pm Last Edit: Oct 02, 2012, 09:29 pm by brunialti Reason: 1
va bene. proviamo una altra via. visto che leggi da una seriale, immagino che i caratteri siano o numeri interi di tipo byte (uint_8) o char.
A questo punto usi una bella union sul tuo buffer che cosè potrai "vedere ed usare" sia come byte che come char a seconda della necessità e inoltre non allochi due buffer (uno per array e uno per stringa). Basta mettere un bel "tappo" alla stringa (uno 0 alla fine dei caratteri letti da rs232).

Code: [Select]
union rs_buf{
 byte b[512];  // o lungo quanto ti pare alla faccia di tuxduino :-)
 char c[512];
 };

rs_buf array;


ma guarda che mi tocca fare per farvi contenti ....

tuxduino


Go Up