Ich möchte Text und Zahlen drucken, die in einer Tabelle mit Serial.print () gemischt sind. von einem char-Array. Mein Problem ist die Konvertierung zwischen den verschiedenen Datentypen. Meine Idee ist es, die Daten der Zeilen in einer for-Schleife mit der Variablen i und die Spalten in einer for-Schleife mit der Variablen j zu drucken.
Ich habe im folgenden Beispiel zwei Variablen, eine vom Typ Integer und der zweite ist ein Doppel. Jetzt möchte ich die Werte der Variablen in das char-Array einfügen, aber ich kann keinen Weg finden, dies zu tun …
In meinem Hauptprogramm müssen die Variablen diese Datentypen und haben sollte später in das char-Array eingefügt werden.
Hat jemand eine Lösung für diese Herausforderung?
Hier ist ein kleiner Beispielcode:
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(); } }
Vielen Dank im Voraus.
Guss
BEARBEITEN: Die Ausgabe sollte folgendermaßen aussehen: Überschrift (in diesem Beispiel ist es der Text „Dies ist eine Zeichenfolge 1 „,“ Dies ist Zeichenfolge 2 „…) und dann die Werte der Variablen in der nächsten Zeile. Es sollte folgendermaßen aussehen:
This is String 1 This is String 2 This is String 3 Variable a Variable b Variable int Variable double Variable double Variable int
Kommentare
- Habe ich Sie richtig verstanden, dass Sie einen ganzzahligen Wert in einen Zeichenpuffer schreiben möchten? Sie können dies mit
snprintf()
. Außerdem stürzt Ihr Beispielcode ab, weil Sie außerhalb der Grenzen desmyStrings
-Arrays auf den Speicher zugreifen. Können Sie ein Beispiel geben, wie die Ausgabe aussehen soll? - Tha nks für deine schnelle antwort. Ich habe in meiner Frage oben bearbeitet. Vielleicht ist das char-Array nicht ' der beste Weg. Ich ' bin offen für Verbesserungen.
- Benötigen Sie die Daten so tabellarisch oder wäre ein Element pro Zeile in Ordnung? Das Tabellieren wird etwas komplizierter. Immer noch machbar, aber schwieriger.
- Es sollte tabellarisch aufgeführt werden, da die Spaltennamen unterschiedlich lang sind.
Antwort
Zunächst sollten Sie sich für eine Datenstruktur für Ihre Tabelle entscheiden. Es gibt viele Möglichkeiten mit verschiedenen Vor- und Nachteilen. Ich wähle hier eine statisch zugewiesene Tabelle mit einer festen Breite für jeden Eintrag in der Tabelle und einer festen Anzahl von Spalten. Man kann auch Zeiger auf Zeichenfolgen verwenden, die auf dem Heap oder anderswo zugewiesen sind, aber ich finde, dass dies am einfachsten ist.
Das Grundproblem ändert sich jedoch nicht: Wir möchten einen ganzzahligen Wert in schreiben Ich verwende hier die C-Bibliotheksfunktion snprintf()
. Diese Funktion ähnelt printf()
, nur dass sie ihre Ausgabe in a schreibt gegebener Puffer mit maximaler Größe. Daher können wir hier einfache Formatzeichenfolgen und einige Problemumgehungen für nicht funktionierende Formatzeichenfolgen verwenden ( Gleitkommawerte .. )
Hier ist der Code.
#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); }
Zwei Runden geben die Ausgabe :
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
Kommentare
- Wow, sehr beeindruckend. Vielen Dank für diesen Code. Ein wenig Frage: Wie kann ich den Tischkopf-Separator automatisch auf die Länge des Tischkopfs drucken?
- Sie können die Anzahl der benötigten Zeichen berechnen, indem Sie
int num = NUM_COLUMNS * MAX_ENTRY_SIZE
, dann drucken Sie das Trennzeichen in einerfor
-Schleife von0
nachnum
.