Sätt heltal och dubbla i char array

Jag vill skriva ut text och siffror blandade i en tabell med Serial.print (); från en char-array. Mitt problem är konverteringen mellan de olika datatyperna. Min idé är att skriva ut data från raderna i en for-loop med variabeln i och kolumnerna i en for-loop med variabeln j.

Jag har i följande exempel två variabler, en är typ heltal och den andra är en dubbel. Nu vill jag lägga till värdena på variablerna i char-arrayen, men jag kan inte hitta ett sätt att göra detta …

I mitt huvudprogram måste variablerna ha dessa datatyper och ska infogas senare i char-arrayen.

Har någon en lösning för den här utmaningen?

Här är en liten exempelkod:

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(); } } 

Tack på förhand.

Guss

EDIT: Utgången ska se ut så här: Rubrik (i det här exemplet är det texten ”This is string 1 ”,” Detta är sträng 2 ”…) och sedan värdena på variablerna i nästa rad. Det ska vara så här:

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

  • Förstod jag dig rätt att du vill skriva ett heltal i en char-buffert? Du kan göra det med snprintf(). Dessutom kraschar din exempelkod eftersom du får åtkomst till minnet utanför myStrings -matrisen. Kan du ge ett exempel på hur utdata ska se ut?
  • Tha nks för ditt snabba svar. Jag har redigerat i min fråga ovan. Kanske är char array inte ' t det bästa sättet. Jag ' är öppen för förbättringar.
  • Behöver du uppgifterna tabulerade så, eller skulle ett objekt per rad vara ok? Att tabellera det blir lite mer komplicerat. Fortfarande genomförbart men svårare.
  • Det bör tabelleras eftersom kolumnnamnen har olika längd.

Svar

Först och främst bör du välja en datastruktur för din tabell. Det finns många alternativ med olika fördelar och nackdelar. Jag väljer en statiskt tilldelad tabell här med en fast bredd för varje post i tabellen och ett fast antal kolumner. Man kan också använda pekare till strängar som tilldelas på högen eller någon annanstans, men jag tycker att detta är det enklaste.

Hur som helst, det grundläggande problemet ändras inte: Vi vill skriva ett heltal i lite strängbuffert. Jag använder C-biblioteksfunktionen snprintf() här. Den här funktionen är som printf(), bara att den skriver sin utdata till en given buffert av maximal storlek. Därför kan vi använda enkla formatsträngar här och några lösningar för icke-fungerande formatsträngar ( flytande punkter .. )

Här är 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); }  

Två omgångar ger 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, mycket imponerande. Tack så mycket för den här koden. En liten fråga, hur kan jag skriva ut bordshuvudavskiljaren till längden på bordshuvudet automatiskt?
  • Du kan beräkna antalet tecken som behövs genom att göra int num = NUM_COLUMNS * MAX_ENTRY_SIZE och skriv sedan ut seperatortecknet i en for slinga från 0 till num.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *