Haluan tulostaa tekstiä ja numeroita sekoitettuna taulukkoon Serial.print (); char-ryhmästä. Minun ongelmani on muuntaminen eri tietotyyppien välillä. Ajatukseni on tulostaa rivien tiedot for-silmukassa muuttujan i ja sarakkeiden for-silmukan muuttujan j kanssa.
Seuraavassa esimerkissä on kaksi muuttujaa, yksi on tyyppi kokonaisluku ja toinen on kaksinkertainen. Haluan nyt lisätä muuttujien arvot char-matriisiin, mutta en löydä tapaa tehdä niin …
Pääohjelmassa muuttujilla on oltava nämä tietotyypit ja tulisi lisätä myöhemmin char-ryhmään.
Onko jollakin ratkaisua tähän haasteeseen?
Tässä on pieni esimerkkikoodi:
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(); } }
Kiitos etukäteen.
Guss
MUOKKAA: Tuloksen tulisi näyttää tältä: Otsikko (tässä esimerkissä se on teksti ”Tämä on merkkijono 1 ”,” Tämä on merkkijono 2 ”…) ja sitten seuraavalla rivillä olevien muuttujien arvot. Sen pitäisi olla seuraava:
This is String 1 This is String 2 This is String 3 Variable a Variable b Variable int Variable double Variable double Variable int
Kommentit
Vastaa
Ensinnäkin sinun tulisi päättää taulukon tietorakenteesta. On olemassa monia vaihtoehtoja, joilla on useita etuja ja haittoja. Valitsen tässä staattisesti varatun taulukon, jossa on kiinteä leveys jokaiselle taulukon merkinnälle ja kiinteä lukumäärä sarakkeita. Voidaan käyttää myös osoittimia jousille, jotka on varattu kasaan tai muualle, mutta mielestäni tämä on yksinkertaisin.
Joka tapauksessa perusongelma ei muutu: Haluamme kirjoittaa kokonaisluvun jonkin verran merkkijonopuskuria. Käytän C-kirjastofunktiota snprintf()
täällä. Tämä toiminto on kuin printf()
, vain että se kirjoittaa lähdön annettu puskurin maksimikoko. Siksi voimme käyttää tässä yksinkertaisia muotoilumerkkijonoja ja joitain kiertotapoja toimimattomille muotoilumerkkijonoille ( liukuluvut .. )
Tässä on koodi.
#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); }
Kaksi kierrosta antaa tuloksen :
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
Kommentit
- Vau, erittäin vaikuttava. Kiitos paljon tästä koodista. Yksi pieni kysymys, miten voin tulostaa taulukon päänerottimen taulukon pään pituudeksi automaattisesti?
- Voit laskea tarvittavien merkkien määrän tekemällä
int num = NUM_COLUMNS * MAX_ENTRY_SIZE
ja tulosta sitten erotinmerkkifor
-silmukassa kohdasta0
muotoonnum
.
snprintf()
. Myös esimerkkikoodi kaatuu, koska käytät muistiamyStrings
-ryhmän rajojen ulkopuolella. Voitteko antaa esimerkin siitä, miltä ulostulon tulisi näyttää?