Szöveget és számokat szeretnék egy táblázatba keverve kinyomtatni a Serial.print (); egy char tömbből. A problémám az átalakítás a különböző adattípusok között. Az ötletem az, hogy kinyomtatom a sorok adatait egy for ciklusban az i változóval, és az oszlopokat egy for ciklusban a j változóval.
A következő példában két változó áll rendelkezésre, az egyik típus egész a második pedig kettős. Most hozzá akarom adni a változók értékeit a char-tömbhöz, de nem találok erre módot …
A fő programomban a változóknak rendelkezniük kell ilyen adattípusokkal és később be kell illeszteni a char tömbbe.
Van valakinek megoldása erre a kihívásra?
Itt van egy kis példakód:
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(); } }
Előre is nagyon köszönöm.
Guss
SZERKESZTÉS: A kimenetnek így kell kinéznie: Headline (ebben a példában ez a “This is string” szöveg 1 “,” Ez a 2. karakterlánc “…), majd a változók értékei a következő sorban. Ennek így kell lennie:
This is String 1 This is String 2 This is String 3 Variable a Variable b Variable int Variable double Variable double Variable int
Megjegyzések
Válasz
Először is el kell döntenie a táblázat adatstruktúráját. Számos lehetőség áll rendelkezésre, különféle előnyökkel és hátrányokkal. Itt statikusan kiosztott táblázatot választok, rögzített szélességgel a táblázat minden bejegyzéséhez és rögzített számú oszloppal. Használhatunk mutatókat olyan húrokra is, amelyek a kupacban vagy máshol vannak kiosztva, de ezt a legegyszerűbbnek találom.
Egyébként az alapprobléma nem változik: Egész számot akarunk írni néhány string puffer. Itt a snprintf()
C könyvtár függvényt használom. Ez a függvény olyan, mint a printf()
, csak annyit ír, hogy a kimenetét egy adott puffer maximális méretű. Így itt egyszerű formátumú karakterláncokat és néhány megoldást használhatunk a nem működő formátumú karakterláncokra ( lebegőpontok .. )
Itt van a kód.
#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); }
Két kör adja meg a kimenetet :
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
Megjegyzések
- Hú, nagyon lenyűgöző. Nagyon köszönöm ezt a kódot. Egy kicsit kérdés, hogyan tudom automatikusan kinyomtatni az asztalfej-elválasztót az asztalfej hosszára?
- A szükséges karakterek számát a
int num = NUM_COLUMNS * MAX_ENTRY_SIZE
, majd nyomtassa ki a szeparátor karaktert egyfor
hurokba0
-bőlnum
.
snprintf()
. Például a kód összeomlik, mert a memóriához amyStrings
tömb határain kívül fér hozzá. Tudna adni egy példát a kimenet küllemére?