Olá pessoal, estou com um pouco de dificuldade com lógica de programação.

A ideia é simples, transformar o valor "123456789012345" em uma array{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5}

Inicialmente pensei em realizar várias divisões:

i = (teste / 100000000000000);
valores[0] = i;
Serial.println(valores[0]); // 1
i = ((teste - (i*100000000000000)) / 10000000000000);
valores[1] = i;
Serial.println(valores[1]); // 2

Mas isso parece uma gambiarra tão grande, que fiquei desconfortável.

Alguém teria uma alternativa?

Exibições: 89

Responder esta

Respostas a este tópico

Boa noite TM,

Uma dúvida? 

está usando arduino Uno/Mega/ESP8266/ESP32.........?

Arduino (8 bits) o maior numero é 0xFF FF FF FF  = 4.294.967.295.

No ESP8266/32  é 0xFF FF FF FF FF FF FF FF =   > 1.152.921.504.606.846.975

Use módulo (%) que facilita tudo.

Se não estiver conseguindo dá um grito de help aqui.

Testa este sketch aqui.

Numero_To_Matriz.ino

RV

Bom dia M.RV

Eu não tinha conhecimento sobre este teto, mas fiquei surpreso pois a divisão estava funcionando, ainda que, caso eu printasse, aparecia o ovf.

Para fugir deste meu código feio, criei um "for" , entretanto, caso haja um "0" no meio dos números, o algorítimo bugava, talvez devesse procurar como obter o número de caracteres da variável, e depois comparar. Isso poderia "resolver", mas ainda acho que seria uma gambiarra.


Atualmente estou utilizando o Arduino Uno, mas hoje devo receber o esp8266 e o esp32 (Se os correios colaborarem). O segundo será usado no protótipo devido a necessidade das telas de LCD TFT (Já fui avisado da maior dificuldade em programar, entretanto, por ser protótipo, tenho que ter um teto para gastos - depois irei posteriormente devo abrir um tópico sobre).

Quanto ao seu código, bem melhor que o meu. hahahaha. fiquei na duvida quanto ao numero de caracteres, mas 2 ou 3 rotinas a mais, não irá gerar lentidão. Ao chegar em casa, irei testa-lo.

Oi TM,

A IDE do  Arduíno suporta só números maiores que 32 bits  "emulativamente"..
Para emular o suporte de números maiores que isto, faz-se necessário o uso do
data type long long ou int64_t, que são equivalentes.

Ao tentar imprimir um numero definido com este data type, você vai ter a seguinte mensagem de erro:
" call of overloaded 'println(long long unsigned int&)' is ambiguous"
ou
" call of overloaded 'println(uint64_t&)' is ambiguous ".

Para conseguir imprimir, veja o recurso que usei no skectch abaixo.

Quando você define um numero com 64 bits, a IDE do Arduíno faz uma manobra e cria
um algorítimo pra trabalhar o numero.

Mas isto consome muita memoria.


Este programa que estou anexando, só por mudar a definição de 32 bits para 64 bits,
cresceu em 398 bytes.

Se usar long para executar, a IDE vai truncar o numero:

123456789012345 em HEX = 7048 860D DF79

unsigned long numero = 123456789012345;

Serial.println(numero,HEX); imprimiu 860DDF79 Veja que perdeu os dois primeiros bytes.

860DDF79 = 2249056121.

Serial.println(numero); imprimiu 2249056121

RV

Numero_To_Matriz2.ino

O código que usei anteriormente está em anexo. Ele funciona com os oito primeiro dígitos. Depois embola tudo (provavelmente, pelo teto do arduino).

Já o seu código "Matriz_1", funcionou impecavelmente até o valor de "4294967295" (que é o teto do arduino, mas o código é bem melhor que o meu).

Com relação a mensagem de ambiguidade, eu iria pesquisar hoje, pois já tinha visto algo quando coloquei um long double, ou algo assim, e colocava para printar.

Sobre o "Numero_to_Matriz2.ino", a parte do buffer eu não entendi paçocas. Claramente preciso ler algo sobre. Mas teve algo que me despertou uma certa curiosidade. Inicialmente ele imprime os valores, mas o "0", que está entre o "9" e o "1", não aparece. O que ocorre aqui?

Isso não interfere na funcionalidade, pois o mais importante é armazenar os valores na matriz. Mas fiquei com isso na cabeça.

Anexos

Bom dia TM,

realmente existe um erro não previsto.

Mas vc entenderá porque o zero desaparece.

O processo separa o numero em 2 partes e imprime cada parte em separado,

mas na primeira impressão não muda de linha.

1a. parte  imprime  123456789

2a parte deveria imprimir 012345, mas como zero á esquerda o serial print suprime,

    fica assim 12345, resultando em 12345678912345.

Mude a linha 13,   de   Serial.print(buffer);  para   Serial.println(buffer); e entenderá .

RV

Obrigado M.RV.  Questões sanadas! =)

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço