Mettez un entier et un double dans le tableau de caractères

Je veux imprimer du texte et des nombres mélangés dans une table avec Serial.print (); à partir dun tableau de caractères. Mon problème est la conversion entre les différents types de données. Mon idée est dimprimer les données des lignes dans une boucle for avec la variable i et les colonnes dans une boucle for avec la variable j.

Jai dans lexemple suivant deux variables, lune est de type entier et le second est un double. Maintenant, je veux ajouter les valeurs des variables dans le char-array, mais je ne peux pas trouver un moyen de le faire …

Dans mon programme principal, les variables doivent avoir ces types de données et devrait être inséré plus tard dans le tableau char.

Quelquun a-t-il une solution pour ce défi?

Voici un petit exemple de code:

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

Merci davance.

Guss

EDIT: La sortie devrait ressembler à ceci: Titre (dans cet exemple, il sagit du texte « This is string 1 « , » Ceci est la chaîne 2 « …) puis les valeurs des variables de la ligne suivante. Cela devrait ressembler à ceci:

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

Commentaires

  • Vous ai-je bien compris que vous vouliez écrire une valeur entière dans un tampon de caractères? Vous pouvez le faire en utilisant snprintf(). De plus, votre exemple de code plante parce que vous accédez à la mémoire en dehors des limites du tableau myStrings. Pouvez-vous donner un exemple de ce à quoi la sortie devrait ressembler?
  • Tha nks pour votre réponse rapide. Jai en édition dans ma question ci-dessus. Peut-être que le tableau de caractères nest pas ' t le meilleur moyen. Je suis ' ouvert pour des améliorations.
  • Avez-vous besoin des données tabulées comme ça, ou est-ce quun élément par ligne serait acceptable? Le tabuler sera un peu plus compliqué. Encore faisable mais plus difficile.
  • Il devrait être tabulé car les noms de colonne sont différents dans sa longueur.

Réponse

Tout dabord, vous devez choisir une structure de données pour votre table. Il existe de nombreuses options présentant divers avantages et inconvénients. Je choisis ici une table allouée statiquement, avec une largeur fixe pour chaque entrée dans la table et un nombre fixe de colonnes. On peut également utiliser des pointeurs vers des chaînes allouées sur le tas ou ailleurs, mais je trouve que cest le plus simple.

Quoi quil en soit, le problème de base ne change pas: nous voulons écrire une valeur entière dans un tampon de chaîne. Jutilise la fonction de bibliothèque C snprintf() ici. Cette fonction est comme printf(), juste quelle écrit sa sortie tampon donné dune taille maximale. Ainsi, nous pouvons utiliser des chaînes de format simples ici et quelques solutions de contournement pour les chaînes de format non fonctionnelles ( virgules flottantes .. )

Voici le 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); }  

Deux tours donnent le résultat :

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 

Commentaires

  • Wow, très impressionnant. Merci beaucoup pour ce code. Un peu question, comment puis-je imprimer automatiquement le séparateur de tête de table à la longueur de la tête de table?
  • Vous pouvez calculer le nombre de caractères nécessaires en faisant int num = NUM_COLUMNS * MAX_ENTRY_SIZE, puis imprimez le caractère séparateur dans une boucle for de 0 à num.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *