Puneți întreg și dublu în matricea de caractere

Vreau să tipăresc text și numere amestecate într-un tabel cu Serial.print (); dintr-o matrice char. Problema mea este conversia între diferitele tipuri de date. Ideea mea este de a imprima datele rândurilor într-o buclă for cu variabila i și a coloanelor într-o buclă for cu variabila j.

Am în următorul exemplu două variabile, una este de tip întreg iar al doilea este un dublu. Acum vreau să adaug valorile variabilelor în char-array, dar nu pot găsi o modalitate de a face acest lucru …

În programul meu principal variabilele trebuie să aibă aceste tipuri de date și ar trebui inserat mai târziu în matricea de caractere.

Are cineva o soluție pentru această provocare?

Iată un mic exemplu de cod:

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

Multe mulțumiri în avans.

Guss

EDIT: Rezultatul ar trebui să arate astfel: Headline (în acest exemplu este textul „Acesta este șirul 1 „,” Acesta este șirul 2 „…) și apoi valorile variabilelor din rândul următor. Ar trebui să fie astfel:

This is String 1 This is String 2 This is String 3 Variable a Variable b Variable int Variable double Variable double Variable int 

Comentarii

  • V-am înțeles corect că doriți să scrieți o valoare într-un buffer de caractere? Puteți face acest lucru folosind snprintf(). De asemenea, exemplificați blocarea codului, deoarece accesați memoria în afara limitelor matricei myStrings. Puteți da un exemplu despre cum ar trebui să arate ieșirea?
  • Tha pentru răspunsul tău rapid. Am în editare în întrebarea mea de mai sus. Poate că char array nu este ' cel mai bun mod. ' sunt deschis pentru îmbunătățiri.
  • Aveți nevoie de datele tabelate așa sau un articol pe rând ar fi ok? Tabelarea acestuia va fi ceva mai complicată. Încă realizabil, dar mai greu.
  • Ar trebui să fie tabelat, deoarece numele coloanelor au o lungime diferită.

Răspuns

În primul rând, ar trebui să decideți o structură de date pentru tabelul dvs. Există multe opțiuni cu diferite avantaje și dezavantaje. Aleg aici un tabel alocat static, cu o lățime fixă pentru fiecare intrare din tabel și un număr fix de coloane. Se poate folosi, de asemenea, pointeri pentru șiruri care sunt alocate pe heap sau în altă parte, dar consider că acesta este cel mai simplu.

Oricum, problema de bază nu se schimbă: vrem să scriem o valoare întreagă în unele buffer de șiruri. Folosesc funcția de bibliotecă C snprintf() aici. Această funcție este ca printf(), doar că își scrie ieșirea într-un tampon dat de o dimensiune maximă. Astfel, putem folosi șiruri de format simplu aici și câteva soluții pentru șiruri de format care nu funcționează ( virgulă mobilă .. )

Iată codul.

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

Două runde dau rezultatul :

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 

Comentarii

  • Uau, foarte impresionant. Mulțumesc mult pentru acest cod. Un mic întrebare, cum pot imprima automat separatorul capului de masă pe lungimea capului de masă?
  • Puteți calcula numărul de caractere necesare făcând int num = NUM_COLUMNS * MAX_ENTRY_SIZE, apoi tipăriți caracterul separator într-o buclă for de la 0 la num.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *