Jeg vil udskrive tekst og tal blandet i en tabel med Serial.print (); fra en char-array. Mit problem er konverteringen mellem de forskellige datatyper. Min idé er at udskrive dataene fra rækkerne i en for-loop med variablen i og kolonnerne i en for-loop med variablen j.
Jeg har i det følgende eksempel to variabler, den ene er type heltal og det andet er en dobbelt. Nu vil jeg tilføje værdierne af variablerne i char-arrayet, men jeg kan ikke finde en måde at gøre dette på.
I mit hovedprogram skal variablerne have disse datatyper og skal indsættes senere i char-arrayet.
Har nogen en løsning på denne udfordring?
Her er et lille 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(); } }
Mange tak på forhånd.
Guss
EDIT: Outputtet skal se sådan ud: Overskrift (i dette eksempel er det teksten “This is string 1 “,” Dette er streng 2 “…) og derefter værdierne for variablerne i næste række. Det skal være sådan:
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 fremmest skal du vælge en datastruktur til din tabel. Der er mange muligheder med forskellige fordele og ulemper. Jeg vælger en statisk tildelt tabel her med en fast bredde for hver post i tabellen og et fast antal kolonner. Man kan også bruge pegepinde til strenge, der er allokeret på bunken eller andre steder, men jeg finder dette for at være det enkleste. noget strengbuffer. Jeg bruger C-biblioteksfunktionen snprintf()
her. Denne funktion ligner printf()
, bare at den skriver sin output til en givet buffer med en maksimal størrelse. Vi kan således bruge enkle formatstrenge her og nogle løsninger til ikke-arbejdende formatstrenge ( flydende 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 giver output :
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, meget imponerende. Mange tak for denne kode. En lille spørgsmål, hvordan kan jeg udskrive bordhovedskilleren automatisk til længden på bordhovedet?
- Du kan beregne antallet af nødvendige tegn ved at gøre
int num = NUM_COLUMNS * MAX_ENTRY_SIZE
, og udskriv derefter seperatortegnet i enfor
-sløjfe fra0
tilnum
.
snprintf()
. Desuden går dit eksempelkode ned, fordi du får adgang til hukommelse uden for grænserne formyStrings
array. Kan du give et eksempel på, hvordan output skal se ud?