Voglio stampare testo e numeri mescolati in una tabella con Serial.print (); da un array di caratteri. Il mio problema è la conversione tra i diversi tipi di dati. La mia idea è di stampare i dati delle righe in un ciclo for con la variabile ie le colonne in un ciclo for con la variabile j.
Nellesempio seguente ho due variabili, una è di tipo intero e il secondo è un doppio. Ora voglio aggiungere i valori delle variabili nellarray di caratteri, ma non riesco a trovare un modo per farlo …
Nel mio programma principale le variabili devono avere questi tipi di dati e dovrebbe essere inserito più tardi nellarray di caratteri.
Qualcuno ha una soluzione per questa sfida?
Ecco un piccolo codice di esempio:
int a = random(0, 100); double b = random(0, 100); char* myStrings[][6] = {"This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5", "This is string 6" }; void setup() { Serial.begin(9600); } void loop() { //now put the integer and double variables into the char array in the second column //Print the values for (int i = 0; i < 2; i++) { for (int j = 0; j < 6; j++) { Serial.print(myStrings[i][j]); Serial.print(" "); delay(100); } Serial.println(); } }
Molte grazie in anticipo.
Guss
EDIT: Loutput dovrebbe assomigliare a questo: Titolo (in questo esempio è il testo “Questa è una stringa 1 “,” Questa è la stringa 2 “…) e quindi i valori delle variabili nella riga successiva. Dovrebbe essere così:
This is String 1 This is String 2 This is String 3 Variable a Variable b Variable int Variable double Variable double Variable int
Commenti
Risposta
Prima di tutto, dovresti decidere per una struttura dati per la tua tabella. Ci sono molte opzioni con vari vantaggi e svantaggi. Sto scegliendo una tabella allocata staticamente qui, con una larghezza fissa per ogni voce nella tabella e un numero fisso di colonne. Si possono anche usare puntatori a stringhe allocate nellheap o altrove, ma trovo che questo sia il più semplice.
Comunque, il problema di base non cambia: vogliamo scrivere un valore intero in un po di buffer di stringhe. Sto usando la funzione di libreria C snprintf()
qui. Questa funzione è come printf()
, solo che scrive il suo output in un dato buffer di una dimensione massima. Pertanto, possiamo utilizzare stringhe di formato semplici qui e alcune soluzioni alternative per stringhe di formato non funzionanti ( virgola mobile .. )
Ecco il codice.
#include <Arduino.h> /* A table is a 2 dimensional array of char buffers. The core element is a char buffer of fixed size. The number of columns must be fixed at compile time. Rows can by dynamically added in the structure without having to declare the number of elements. You can declare the number of rows at compile time, but do not need to fill them. Thus you can dynamically add rows to the table. */ #define MAX_ENTRY_SIZE 20 #define NUM_COLUMNS 3 #define COLUMN_PRINT_WIDTH MAX_ENTRY_SIZE char myTable[][NUM_COLUMNS][MAX_ENTRY_SIZE] = { {"Column 1", "Column 2" ,"Column 3"}, //Row 1 {"Variable a", "Variable b", "Variable int"}, //Row 2 {"Variable double", "Variable double" ,"Variable double"}, //Row 1 }; char* get_table_entry(int row, int column) { char* entry = myTable[row][column]; return entry; } void write_int_to_table(int value, int row, int column) { //Get a pointer to where the entry is char* entry = get_table_entry(row, column); //write a new string inside it snprintf(entry, MAX_ENTRY_SIZE, "%d", value); } void write_double_to_table(double value, int row, int column) { //Same as above, different format string.. char* entry = get_table_entry(row, column); //Formatting floats on an Arduino Uno is tricky. %f formatters don"t work (cut out due to size.) //use String API instead String stringFloat(value); const char* cString = stringFloat.c_str(); strncpy(entry, cString, MAX_ENTRY_SIZE); } void print_table() { //Get number of Rows int numRows = sizeof(myTable) / (MAX_ENTRY_SIZE * NUM_COLUMNS); for(int row = 0; row < numRows; row++) { //Print all columns of this row for(int column = 0; column < NUM_COLUMNS; column++) { char* entry = get_table_entry(row, column); Serial.print(entry); //fill with spaces to the right for(unsigned int i=0; i< COLUMN_PRINT_WIDTH - strlen(entry); i++) Serial.print(" "); } Serial.println(); //Table header seperator if(row == 0) Serial.println("============================================"); } } void setup() { Serial.begin(9600); print_table(); } void loop() { int a = random(0, 100); double b = random(0, 100); Serial.print("Will write new values for a = "); Serial.print(a); Serial.print(" and b = "); Serial.println(b); //write these in the second row (first row after header), first and second column. write_int_to_table(a, 1, 0); write_double_to_table(b, 1, 1); //Print table again print_table(); Serial.println(); Serial.println(); delay(5000); }
Due round danno il risultato :
Column 1 Column 2 Column 3 ============================================ Variable a Variable b Variable int Variable double Variable double Variable double Will write new values for a = 7 and b = 49.00 Column 1 Column 2 Column 3 ============================================ 7 49.00 Variable int Variable double Variable double Variable double
Commenti
- Wow, davvero impressionante. Grazie mille per questo codice. Un po domanda, come posso stampare automaticamente il separatore dellintestazione della tabella sulla lunghezza dellintestazione della tabella?
- Puoi calcolare il numero di caratteri necessari eseguendo
int num = NUM_COLUMNS * MAX_ENTRY_SIZE
, quindi stampa il carattere separatore in unfor
ciclo da0
anum
.
snprintf()
. Inoltre, il codice di esempio si arresta in modo anomalo perché accedi alla memoria al di fuori dei limiti dellarraymyStrings
. Puoi fornire un esempio di come dovrebbe apparire loutput?