整数とdoubleをchar配列に入れます

Serial.print();を使用してテーブルに混合されたテキストと数値を出力したい。 char配列から。私の問題は、異なるデータ型間の変換です。私の考えは、変数iを使用してforループの行のデータを出力し、変数jを使用してforループの列のデータを出力することです。

次の例では、2つの変数があります。1つは整数型です。 2番目はダブルです。ここで、変数の値をchar配列に追加したいのですが、これを行う方法が見つかりません…

メインプログラムでは、変数にこのデータ型が必要であり、後でchar配列に挿入する必要があります。

誰かがこの課題の解決策を持っていますか?

ここに小さなサンプルコードがあります:

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

よろしくお願いします。

Guss

編集:出力は次のようになります:見出し(この例では、「これは文字列です」というテキストです。 1 “、”これは文字列2 “…)で、次の行の変数の値です。次のようになります。

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

コメント

  • charバッファに整数値を書き込みたいことを正しく理解しましたか?snprintf()。また、myStrings配列の範囲外のメモリにアクセスしたため、サンプルコードがクラッシュします。出力がどのように表示されるかの例を挙げてください。
  • Thaあなたの速い答えのためのnks。上記の質問を編集しています。たぶん、char配列は'最善の方法ではありません。 '改善の余地があります。
  • そのように表にしたデータが必要ですか、それとも1行に1つの項目で問題ありませんか。それを集計することはもう少し複雑になります。それでも実行可能ですが、困難です。
  • 列名の長さが異なるため、表にまとめる必要があります。

回答

まず、テーブルのデータ構造を決定する必要があります。さまざまな長所と短所を持つ多くのオプションがあります。ここでは、静的に割り当てられたテーブルを選択しています。テーブルの各エントリの幅と列の数は固定されています。ヒープや他の場所に割り当てられた文字列へのポインタを使用することもできますが、これが最も簡単だと思います。

とにかく、基本的な問題は変わりません。整数値をで書きたいのです。文字列バッファ。ここではCライブラリ関数snprintf()を使用しています。この関数はprintf()に似ていますが、出力を最大サイズの与えられたバッファ。したがって、ここでは単純なフォーマット文字列と、機能しないフォーマット文字列のいくつかの回避策を使用できます(浮動小数点..

コードは次のとおりです。

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

2回のラウンドで出力が得られます:

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 

コメント

  • すごい、とても印象的です。このコードをありがとうございます。少しだけ質問、テーブルヘッドセパレータをテーブルヘッドの長さに自動的に印刷するにはどうすればよいですか?
  • を実行すると、必要な文字数を計算できます。 div id = “8d39914b66″>

次に、区切り文字をforループで0からnum

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です