Colocar inteiro e duplo no array char

Quero imprimir texto e números misturados em uma tabela com Serial.print (); de uma matriz char. Meu problema é a conversão entre os diferentes tipos de dados. Minha ideia é imprimir os dados das linhas em um loop for com a variável i e as colunas em um loop for com a variável j.

Eu tenho no exemplo a seguir duas variáveis, uma é do tipo inteiro e o segundo é um duplo. Agora eu quero adicionar os valores das variáveis ao array char, mas não consigo encontrar uma maneira de fazer isso …

No meu programa principal, as variáveis precisam ter esses tipos de dados e deve ser inserido posteriormente na matriz char.

Alguém tem uma solução para este desafio?

Aqui está um pequeno código de exemplo:

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

Muito obrigado antecipadamente.

Guss

EDITAR: A saída deve ser parecida com esta: Título (neste exemplo, é o texto “Este é um string 1 “,” Esta é a string 2 “…) e então os valores das variáveis na próxima linha. Deve ser assim:

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

Comentários

  • Eu entendi corretamente que você deseja escrever um valor inteiro em um buffer de char? Você pode fazer isso usando snprintf(). Além disso, seu exemplo de código trava porque você acessa a memória fora dos limites da matriz myStrings. Você pode dar um exemplo de como a saída deve ser?
  • Tha nks pela sua resposta rápida. Tenho em edição na minha pergunta acima. Talvez a matriz char não seja ' a melhor maneira. Eu ' estou aberto para melhorias.
  • Você precisa dos dados tabulados dessa forma ou um item por linha estaria correto? Tabulá-lo será um pouco mais complicado. Ainda factível, mas mais difícil.
  • Deve ser tabulado porque os nomes das colunas são diferentes em seu comprimento.

Resposta

Primeiro de tudo, você deve decidir por uma estrutura de dados para sua tabela. Existem muitas opções com várias vantagens e desvantagens. Estou escolhendo uma tabela alocada estaticamente aqui, com uma largura fixa para cada entrada na tabela e um número fixo de colunas. Também se pode usar ponteiros para strings que são alocadas na pilha ou em outro lugar, mas acho que isso é o mais simples.

De qualquer forma, o problema básico não muda: queremos escrever um valor inteiro em algum buffer de string. Estou usando a função de biblioteca C snprintf() aqui. Esta função é como printf(), apenas que grava sua saída em um dado buffer de tamanho máximo. Assim, podemos usar strings de formato simples aqui e algumas soluções alternativas para strings de formato que não funcionam ( pontos flutuantes .. )

Aqui está o código.

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

Duas rodadas fornecem o resultado :

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 

Comentários

  • Uau, muito impressionante. Muito obrigado por este código. Um pouco pergunta, como posso imprimir o separador do cabeçote da mesa automaticamente no comprimento do cabeçalho da mesa?
  • Você pode calcular o número de caracteres necessários fazendo int num = NUM_COLUMNS * MAX_ENTRY_SIZE e, em seguida, imprima o caractere separador em um for loop de 0 para num.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *