Jeg vil skrive ut tekst og tall blandet i en tabell med Serial.print (); fra en røyeoppstilling. Problemet mitt er konverteringen mellom de forskjellige datatypene. Tanken min er å skrive ut dataene til radene i en for-loop med variabelen i og kolonnene i en for-loop med variabelen j.
Jeg har i det følgende eksemplet to variabler, den ene er typen heltall og den andre er en dobbel. Nå vil jeg legge til verdiene til variablene i char-arrayet, men jeg kan ikke finne en måte å gjøre dette på.
I hovedprogrammet mitt må variablene ha disse datatypene og skal settes inn senere i char-arrayet.
Har noen en løsning på denne utfordringen?
Her er en liten eksempelkode:
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(); } }
Tusen takk på forhånd.
Guss
EDIT: Utgangen skal se slik ut: Overskrift (i dette eksemplet er det teksten «This is string 1 «,» Dette er streng 2 «…) og deretter verdiene til variablene i neste rad. Det skal være slik:
This is String 1 This is String 2 This is String 3 Variable a Variable b Variable int Variable double Variable double Variable int
Kommentarer
Svar
Først og fremst bør du bestemme deg for en datastruktur for tabellen din. Det er mange alternativer med forskjellige fordeler og ulemper. Jeg velger en statisk tildelt tabell her, med en fast bredde for hver oppføring i tabellen og et fast antall kolonner. Man kan også bruke pekere til strenger som er tildelt på dyngen eller andre steder, men jeg synes dette er det enkleste.
Uansett, det grunnleggende problemet endres ikke: Vi ønsker å skrive et heltall i noe strengbuffer. Jeg bruker C-biblioteksfunksjonen snprintf()
her. Denne funksjonen er som printf()
, bare at den skriver utgangen til en gitt buffer med maksimal størrelse. Dermed kan vi bruke enkle formatstrenger her og noen løsninger for ikke-fungerende formatstrenger ( flytende punkter .. )
Her er koden.
#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); }
To runder gir utdata :
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
Kommentarer
- Wow, veldig imponerende. Tusen takk for denne koden. En liten spørsmål, hvordan kan jeg skrive ut bordhodeskilleren automatisk til lengden på bordhodet?
- Du kan beregne antall nødvendige tegn ved å gjøre
int num = NUM_COLUMNS * MAX_ENTRY_SIZE
, og skriv deretter ut seperatortegnet i enfor
sløyfe fra0
tilnum
.
snprintf()
. Eksemplet på kode krasjer også fordi du får tilgang til minne utenfor grensene formyStrings
matrisen. Kan du gi et eksempel på hvordan utdataene skal se ut?